using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; using System.IO; using taurus.client; using taurus.unity; using System.Text; class ReadAssetBase : EditorWindow { private bool ios = true; private bool android = true; private bool android32 = true; // 版本号 private static string baseVersion = ""; #if UNITY_IPHONE static string PACK_PATH = Path.Combine(Path.GetFullPath(Path.Combine(Application.dataPath, "..")), "Pack", "iOS"); static string PACK_PATH_ALL = Path.Combine(Path.GetFullPath(Path.Combine(Application.dataPath, "..")), "Pack_All", "iOS"); #else static string PACK_PATH = Path.Combine(Path.GetFullPath(Path.Combine(Application.dataPath, "..")), "Pack", "Android"); static string PACK_PATH_ALL = Path.Combine(Path.GetFullPath(Path.Combine(Application.dataPath, "..")), "Pack_All", "Android"); #endif static string PACK_PATH_Config = Path.Combine(Path.GetFullPath(Path.Combine(Application.dataPath, "..")), "Pack", "config"); static string READ_PATH = Path.Combine(Application.streamingAssetsPath, "Pack"); static string READ_ZIP = Path.Combine(Application.streamingAssetsPath, "Pack.byte"); static string READ_VERSION = Path.Combine(Application.streamingAssetsPath, "version.txt"); [MenuItem("BuildTools/Read Pack In Local")] public static void ShowWindow() { // 弹出窗口 var window = GetWindow("Read Pack In Local"); window.minSize = new Vector2(300, 150); } private void OnGUI() { // 第三行:版本号输入框 baseVersion = EditorGUILayout.TextField("版本号", baseVersion); GUILayout.FlexibleSpace(); // 最后一行:确定、取消按钮 EditorGUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); if (GUILayout.Button("确定", GUILayout.Width(80))) { ReadAssetBaseRun(); } if (GUILayout.Button("取消", GUILayout.Width(80))) { Close(); } EditorGUILayout.EndHorizontal(); GUILayout.Space(8); } //[MenuItem("BuildTools/Read Pack In Local")] static public void ReadAssetBaseRun() { if (!Directory.Exists(PACK_PATH)) { Debug.LogError("请打包后再运行解压操作"); return; } if (baseVersion.Trim().Equals("")) { Debug.LogError("请输入版本号"); return; } try { EditorApplication.LockReloadAssemblies(); EditorUtility.DisplayProgressBar("正在解压资源包中", "请稍候,正在处理资源...", 0f); if (Directory.Exists(READ_PATH)) { Directory.Delete(READ_PATH, true); } Directory.CreateDirectory(READ_PATH); if (File.Exists(READ_ZIP)) { File.Delete(READ_ZIP); } if (File.Exists(READ_VERSION)) { File.Delete(READ_VERSION); } if (!File.Exists(PACK_PATH_ALL)) { Directory.CreateDirectory(PACK_PATH_ALL); } if (!File.Exists(PACK_PATH_Config)) { Directory.CreateDirectory(PACK_PATH_Config); } string baseString = Path.Combine(Application.streamingAssetsPath, "init2_1.json"); string baseBytes = File.ReadAllText(baseString); ArrayList baseList = (ArrayList)MiniJSON.Json.Deserialize(baseBytes); string extendString = Path.Combine(Application.streamingAssetsPath, "init1_1.json"); string extendBytes = File.ReadAllText(extendString); ArrayList extendList = (ArrayList)MiniJSON.Json.Deserialize(extendBytes); //把PACK_PATH当前打包的内容复制到PACK_PATH_ALL里,再通过All去加载配置文件和本地资源包 for (int i = 0; i < baseList.Count; i++) { var tem = (Hashtable)baseList[i]; string _base_path = Path.Combine("base", tem["name"] as string); string version = tem["version"] as string; var zip_path = Path.Combine(PACK_PATH, _base_path, $"asset_pack{version}.bytes"); var temp = Path.Combine(PACK_PATH_ALL, _base_path, $"asset_pack{version}.bytes"); if (File.Exists(zip_path)) { var dir = Path.GetDirectoryName(temp); if (!Directory.Exists(dir)) Directory.CreateDirectory(dir); File.Copy(zip_path, temp, true); } if (File.Exists(temp)) { long size = new FileInfo(temp).Length; tem["size"] = size; } else { tem["size"] = 0; } } //生成对应的json文件 string newBaseJson = MiniJSON.Json.Serialize(baseList); string arv_config = Path.Combine(PACK_PATH_Config, string.Format("asset_config{0}.json", baseVersion)); File.WriteAllText(arv_config, newBaseJson); StringBuilder redisScript = new StringBuilder(); for (int i = 0; i < extendList.Count; i++) { var tem = (Hashtable)extendList[i]; string extendBundle = tem["bundle"] as string; string[] extendNameTem = extendBundle.Split('/'); string _extend_path = Path.Combine(extendNameTem); string version = tem["version"] as string; var zip_path = Path.Combine(PACK_PATH, _extend_path, $"asset_pack{version}.bytes"); var temp = Path.Combine(PACK_PATH_ALL, _extend_path, $"asset_pack{version}.bytes"); if (File.Exists(zip_path)) { var dir = Path.GetDirectoryName(temp); if (!Directory.Exists(dir)) Directory.CreateDirectory(dir); File.Copy(zip_path, temp, true); } string gameId = tem["game_id"] as string; long size = 0L; if (File.Exists(temp)) { size = new FileInfo(temp).Length; } redisScript.AppendLine($"HSET game:{gameId} version \"{version}\""); redisScript.AppendLine($"HSET game:{gameId} size {size}"); redisScript.AppendLine($"HINCRBY game:{gameId} cache_ver 1"); redisScript.AppendLine(); } // 写入 redis_update.txt string redisPath = Path.Combine(PACK_PATH_Config, "redis_update.txt"); File.WriteAllText(redisPath, redisScript.ToString()); //再去PACK_PATH_ALL生成懒人资源包和配置文件 for (int i = 0; i < baseList.Count; i++) { var tem = (Hashtable)baseList[i]; string _base_path = Path.Combine("base", tem["name"] as string); string version = tem["version"] as string; __UnPack(version, _base_path); } for (int i = 0; i < extendList.Count; i++) { var tem = (Hashtable)extendList[i]; string extendBundle = tem["bundle"] as string; string[] extendNameTem = extendBundle.Split('/'); string _extend_path = Path.Combine(extendNameTem); string version = tem["version"] as string; __UnPack(version, _extend_path); } //string arv = Path.Combine(READ_PATH, string.Format("asset_config{0}.json", baseVersion)); //File.WriteAllText(arv, baseBytes); //string rv = Path.Combine(READ_PATH, "version.txt"); //File.WriteAllText(rv, baseVersion); File.WriteAllText(READ_VERSION, baseVersion); IFilePack zf = null; zf = new FilePack20(READ_ZIP, PackMode.Write); zf.PackFile(READ_PATH, ".meta|.manifest"); zf = null; //Directory.Delete(READ_PATH, true); EditorUtility.DisplayDialog("完成", "处理完毕!", "确定"); } finally { EditorUtility.ClearProgressBar(); EditorApplication.UnlockReloadAssemblies(); } } static void __UnPack(string version, string _base_path) { try { string dir = PACK_PATH_ALL; var zip_path = Path.Combine(dir, _base_path, $"asset_pack{version}.bytes"); if (!File.Exists(zip_path)) { Debug.LogError("打包文件不完全,请将打包所有资源包"); throw new System.Exception(); } IFilePack zip = null; zip = new FilePack20(zip_path, PackMode.Read); zip.UnPackFile(READ_PATH); var lua_pack_path = Path.Combine(READ_PATH, "lua_pack"); if (File.Exists(lua_pack_path)) { var lua_dir = Path.Combine(READ_PATH, "lua/"); if (!Directory.Exists(READ_PATH)) Directory.CreateDirectory(READ_PATH); zip = new FilePack20(lua_pack_path, PackMode.Read); zip.UnPackFile(lua_dir); File.Delete(lua_pack_path); } string rv = Path.Combine(READ_PATH, _base_path, "version.txt"); string directory = Path.GetDirectoryName(rv); if (!Directory.Exists(directory)) { Directory.CreateDirectory(directory); // 递归创建所有不存在的文件夹 } File.WriteAllText(rv, version, System.Text.Encoding.ASCII); } catch { Directory.Delete(READ_PATH, true); } } }