#if UNITY_EDITOR using System; using System.Collections.Generic; using System.IO; using System.Security.Cryptography; using System.Text; using UnityEditor; using UnityEngine; /* * 20211212 * 功能:主要用于分析各个文件的MD5 文件大小 最终保存到txt * */ namespace Axibug { public class AddChild : ScriptableObject { public static bool isHotUpdate = true; //是否热更新版本 [MenuItem("Axibug/createVersion_Win64")] static void createWindows64() { writeFileInfo(BuildTarget.StandaloneWindows64); } [MenuItem("Axibug/createVersion_Android")] static void createAndroid() { writeFileInfo(BuildTarget.Android); } [MenuItem("Axibug/createVersion_IOS")] static void createIOS() { writeFileInfo(BuildTarget.iOS); } public static void writeFileInfo(BuildTarget target) { string filePath = ""; //根据目标平台创建路径 switch (target) { //case BuildTarget.StandaloneWindows64: // filePath = $"AssetBundles/StandaloneWindows64/"; // break; //case BuildTarget.Android: // filePath = $"AssetBundles/Android/"; // break; //case BuildTarget.iOS: // filePath = $"AssetBundles/IOS/"; // break; case BuildTarget.StandaloneWindows64: filePath = $"StandaloneWindows64"; break; case BuildTarget.Android: filePath = $"Android"; break; case BuildTarget.iOS: filePath = $"IOS"; break; } writeFileInfo(filePath); } public static string computeMd5(string filename) { string filemd5 = null; try { using (var fileStream = File.OpenRead(filename)) { var md5 = MD5.Create(); var fileMD5Bytes = md5.ComputeHash(fileStream);//计算指定Stream 对象的哈希值 filemd5 = FormatMD5(fileMD5Bytes); } } catch (System.Exception ex) { } return filemd5; } //字节数组转为字符串 public static string FormatMD5(byte[] data) { return System.BitConverter.ToString(data).Replace("-", "").ToLower();//将byte[]装换成字符串 } public static void writeFileInfo(string targetPath) { string projectPath = System.Environment.CurrentDirectory; string fullPath = $"{projectPath}/AssetBundles/{targetPath}/"; string path = fullPath + "/version.txt"; if (File.Exists(path)) File.Delete(path); int totalSize = 0; //获取指定路径下面的所有资源文件 if (Directory.Exists(fullPath)) { DirectoryInfo direction = new DirectoryInfo(fullPath); FileInfo[] files = direction.GetFiles("*", SearchOption.AllDirectories); //文件列表 FileList list = new FileList(); list.listinfo = new List(); writeLoginSeverInfo(list); Debug.Log(files.Length); for (int i = 0; i < files.Length; i++) { if (files[i].Name.EndsWith(".meta")/* || files[i].Name.EndsWith(".txt")*/) { continue; } string md5 = computeMd5(files[i].FullName); string[] condition = { $"{targetPath}\\" }; string[] arr = files[i].FullName.Split(condition, StringSplitOptions.None); if (arr.Length != 2) continue; string filepath = arr[1].Replace("\\", "/"); FileData jd = new FileData(); jd.filename = filepath; jd.hash = md5; jd.length = (int)files[i].Length; totalSize += jd.length; list.listinfo.Add(jd); } //回写总大小 list.listinfo[1].length = totalSize; Debug.Log("list.listinfo:" + list.listinfo.Count); //写入jscon文件 string str = JsonUtility.ToJson(list); File.AppendAllText(path, str); Debug.Log("生成version成功..." + list.listinfo.Count); } } //写入登录服务器配置信息 private static void writeLoginSeverInfo(FileList list) { //0 写入送检版本号 FileData d = new FileData(); d.filename = "versionCheck"; if (isHotUpdate) d.hash = "9.9.9"; else d.hash = Application.version; d.length = 0; list.listinfo.Add(d); //1 写入当前版本号 FileData d2 = new FileData(); d2.filename = "version.txt"; d2.hash = Application.version; d2.length = 0; list.listinfo.Add(d2); string src = "DE,130,20180408,testcode,113.250.55.88:15100"; string str1 = ToEncrypt("1981", src); //2 配置登录服务器IP PORT FileData d3 = new FileData(); d3.filename = "loginServer"; d3.hash = str1; d3.length = 0; list.listinfo.Add(d3); } //对字符串进行加密 static string ToEncrypt(string encryptKey, string str) { try { byte[] P_byte_key = Encoding.Unicode.GetBytes(encryptKey);//将密钥字符串转换为字节序列 byte[] P_byte_data = Encoding.Unicode.GetBytes(str); //将字符串转换为字节序列 MemoryStream P_Stream_MS = new MemoryStream();//创建内存流对象 { using (CryptoStream P_CryptStream_Stream = new CryptoStream(P_Stream_MS, new DESCryptoServiceProvider().CreateEncryptor(P_byte_key, P_byte_key), CryptoStreamMode.Write)) { P_CryptStream_Stream.Write(P_byte_data, 0, P_byte_data.Length);//向加密流中写入字节序列 P_CryptStream_Stream.FlushFinalBlock();//将数据压入基础流 byte[] P_bt_temp = P_Stream_MS.ToArray();//从内存流中获取字节序列 return Convert.ToBase64String(P_bt_temp); } } } catch (CryptographicException ce) { throw new Exception(ce.Message); } } [MenuItem("Axibug/Create ClassTypes")] public static void FindAllUnityClass() { EditorUtility.DisplayProgressBar("Progress", "Find Class...", 0); string[] dirs = { "Assets/Resources/Prefabs" }; var asstIds = AssetDatabase.FindAssets("t:Prefab", dirs); int count = 0; List classList = new List(); for (int i = 0; i < asstIds.Length; i++) { string path = AssetDatabase.GUIDToAssetPath(asstIds[i]); var pfb = AssetDatabase.LoadAssetAtPath(path); foreach (Transform item in pfb.transform) { var coms = item.GetComponentsInChildren(); foreach (var com in coms) { string tName = com.GetType().FullName; if (!classList.Contains(tName)/* && tName.StartsWith("UnityEngine")*/) { classList.Add(tName); } } } count++; EditorUtility.DisplayProgressBar("Find Class", pfb.name, count / (float)asstIds.Length); } for (int i = 0; i < classList.Count; i++) { classList[i] = string.Format("", classList[i]); } System.IO.File.WriteAllLines(Application.dataPath + "/ClassTypes.txt", classList); EditorUtility.ClearProgressBar(); } } } #endif