using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; using System.IO; using System.Linq; using GameEditor.Core; using GameEditor.GameEditor.PlayerBuilder; using GameLogic; using System.Diagnostics; using ResUpdate; using GameCore; using System.Net; namespace GameEditor.FrameTool { public class BuildWindow : EditorWindow { /// /// 版本文件名 /// const string VersionsFile = "version"; Version version; string defaultVersion; string subChannel; string serverUrl; string resUrl; /// /// 导出APK/XCODE工程 /// bool isBuildPlayer; /// /// 是否拷贝AB包到StreamingAssets /// bool isCopyABSToStreamingAssets; // Add menu named "My Window" to the Window menu [MenuItem("Build/BuildWindow")] static void Init() { // Get existing open window or if none, make a new one: BuildWindow window = (BuildWindow)EditorWindow.GetWindow(typeof(BuildWindow)); window.Show(); window.InitWindow(); } void InitWindow() { InitSize(); InitGames(); } /// /// 初始化大小 /// void InitSize() { minSize = new Vector2(300, 400); maxSize = new Vector2(300, 650); } /// /// 初始化游戏 /// void InitGames() { //version = new Version(Resources.Load(VersionsFile).text); //defaultVersion = version.GetInfo("version"); //subChannel = version.GetInfo("subChannel"); //serverUrl = version.GetInfo("serverUrl"); //resUrl = version.GetInfo("resUrl"); } void OnGUI() { EditorGUILayout.BeginVertical(); EditorGUILayout.Space(); EditorGUILayout.LabelField(string.Format("当前平台:{0}", EditorUserBuildSettings.activeBuildTarget.ToString())); EditorGUILayout.Space(); EditorGUILayout.EndVertical(); isCopyABSToStreamingAssets = EditorGUILayout.BeginToggleGroup("拷贝AssetBundle到流媒体目录(打包到App包体内)", isCopyABSToStreamingAssets); //if (isCopyABSToStreamingAssets) //{ // EditorGUILayout.BeginVertical(); // defaultVersion = EditorGUILayout.TextField("Version", defaultVersion); // subChannel = EditorGUILayout.TextField("SubChannel", subChannel); // serverUrl = EditorGUILayout.TextField("ServerUrl", serverUrl); // resUrl = EditorGUILayout.TextField("ResUrl", resUrl); // EditorGUILayout.EndVertical(); //} EditorGUILayout.EndToggleGroup(); EditorGUILayout.Space(); isBuildPlayer = EditorGUILayout.BeginToggleGroup(GetBuildTitle(), isBuildPlayer); if (isBuildPlayer) { var gameSet = GameObject.FindObjectOfType(); gameSet.settingInfo.isUpdate = true; gameSet.settingInfo.bundleMode = true; gameSet.settingInfo.isDebug = false; gameSet.settingInfo.luaBundleMode = true; } EditorGUILayout.EndToggleGroup(); EditorGUILayout.Space(); if (GUILayout.Button("整体打包", GUILayout.Height(40f))) { if (EditorUtility.DisplayDialog("打包提示", "打包将持续一段时间,确定打包?", "是", "否")) //显示对话框 { BuildGame(); } } if (GUILayout.Button("单打lua资源", GUILayout.Height(40f))) { if (EditorUtility.DisplayDialog("打包提示", "单打lua资源将持续一段时间,确定打包?", "是", "否")) //显示对话框 { if (FrameTool.BuildLuaAssetBundles()) { //拷贝AssetBundle到流媒体目录 if (isCopyABSToStreamingAssets) { string exportPath = AssetBundle.AssetBundleConfig.GetExportPath(EditorUserBuildSettings.activeBuildTarget); string targetPath = FrameTool.GetStreamingAssetPath(EditorUserBuildSettings.activeBuildTarget); #if PLATFORM_IOS File.Copy(exportPath + "/lzma_luabytes.unity3d", targetPath + "/lzma_luabytes.unity3d", true); File.Copy(exportPath + "/lzma_resconfigs.unity3d", targetPath + "/lzma_resconfigs.unity3d", true); #else File.Copy(exportPath + "/lzma/luabytes.unity3d", targetPath + "/lzma/luabytes.unity3d", true); File.Copy(exportPath + "/lzma/resconfigs.unity3d", targetPath + "/lzma/resconfigs.unity3d", true); #endif File.Copy(exportPath + "/files.unity3d", targetPath + "/files.unity3d", true); //SaveVersionFile(); } Close(); } } } if (GUILayout.Button("资源合法性检查", GUILayout.Height(40f))) { FrameTool.CheckAssetBundleStates(); } if (GUILayout.Button("查看多依赖资源", GUILayout.Height(40f))) { FrameTool.AssetsDuplicatedInMultBundlesCache(1); } if (GUILayout.Button("处理多依赖资源", GUILayout.Height(40f))) { FrameTool.AssetsDuplicatedInMultBundlesCache(2); } } /// /// 打包游戏 /// void BuildGame() { //打包游戏 FrameTool.BuildGameAssetBundles(); //拷贝AssetBundle到流媒体目录 if (isCopyABSToStreamingAssets) { FrameTool.CopyAssetBundleToStreamingAssets(); //SaveVersionFile(); } //是否BuildPlayer if (isBuildPlayer) { switch (EditorUserBuildSettings.activeBuildTarget) { case BuildTarget.Android: ExportApk(); break; case BuildTarget.iOS: ExportXcode(); break; } } Close(); } void SaveVersionFile() { var VersionsFilePath = Application.dataPath + "/Resources/" + VersionsFile + ".txt"; var VersionsFilePath2 = AppConst.PersistentDataPath + VersionsFile + ".txt"; version.SetInfo("version", defaultVersion); version.SetInfo("subChannel", subChannel); version.SetInfo("serverUrl", serverUrl); version.SetInfo("resUrl", resUrl); string directoryPath = Path.GetDirectoryName(VersionsFilePath); if (!Directory.Exists(directoryPath)) Directory.CreateDirectory(directoryPath); File.WriteAllText(VersionsFilePath, version.ToJson(), System.Text.Encoding.UTF8); string directoryPath2 = Path.GetDirectoryName(VersionsFilePath2); if (!Directory.Exists(directoryPath2)) Directory.CreateDirectory(directoryPath2); File.WriteAllText(VersionsFilePath2, version.ToJson(), System.Text.Encoding.UTF8); } /// /// 获取是否打包 /// /// string GetBuildTitle() { switch (EditorUserBuildSettings.activeBuildTarget) { case BuildTarget.Android: return "导出APK"; case BuildTarget.iOS: return "导出XCODE工程"; } return "请切换到Android/IOS平台"; } /// /// 导出XCODE工程 /// void ExportXcode() { PlayerBuilder.BuildXCode(); } /// /// 是否导出APK /// void ExportApk() { PlayerBuilder.BuildApk(); } } public class VersionTxt { public string subChannel; public string buglyId; public string channel; public string resUrl; public string packageVersion; public string version; public string serverUrl; //public string noticeChannel; } public class VersionWindow : EditorWindow { static string versionPath = Application.dataPath + "/../Version"; static string editorVersion = Application.dataPath + "/../AssetBundles";// + AppConst.GameVersionFile; //static string persistVersion = Application.dataPath + "/Resources/version.txt"; static string streamVersion = AppConst.StreamPath + AppConst.GameVersionFile; static VersionTxt m_VersionTxt; // 热更版本 static string[] m_Files; static bool[] m_Choose; static string m_Ver; [MenuItem("Build/Version")] static void Init() { LoadVersion(editorVersion); LoadDic(); // Get existing open window or if none, make a new one: VersionWindow window = (VersionWindow)EditorWindow.GetWindow(typeof(VersionWindow)); window.Show(); } // 加载version文件 private static void LoadVersion(string path) { versionPath = path + "/" + AppConst.GameVersionFile; if (!string.IsNullOrEmpty(versionPath) && File.Exists(versionPath)) { string json = File.ReadAllText(versionPath); m_VersionTxt = JsonUtility.FromJson(json); } if (!path.Equals(editorVersion)) { SaveToEditorPath(); } } // 保存到编辑器路径 private static void SaveToEditorPath() { string json = JsonUtility.ToJson(m_VersionTxt); SaveToVersion(editorVersion, json); } // 保存到打包路径 private static void SaveToBuildPath() { string json = JsonUtility.ToJson(m_VersionTxt); //SaveToVersion(persistVersion, json); SaveToVersion(streamVersion, json); } // 保存到version private static void SaveToVersion(string path, string json) { if (!string.IsNullOrEmpty(path) && File.Exists(path)) { File.WriteAllText(path, json); }else { UnityEngine.Debug.Log("未找到目标路径:"+path); } } // 加载version目录 private static void LoadDic() { //if (!string.IsNullOrEmpty(versionPath) && Directory.Exists(versionPath)) //{ ClientConfigManager.Instance.SVN_Update(); m_Files = ClientConfigManager.Instance.GetVersionList();//Directory.GetFiles(versionPath, "*.txt", SearchOption.AllDirectories); m_Choose = new bool[m_Files.Length]; //} } void OnGUI() { EditorGUILayout.BeginVertical(); EditorGUILayout.LabelField("version文件配置:"); EditorGUILayout.Space(); EditorGUILayout.LabelField("登录服地址:"); m_VersionTxt.serverUrl = EditorGUILayout.TextField("", m_VersionTxt.serverUrl); EditorGUILayout.LabelField("热更CDN地址:"); m_VersionTxt.resUrl = EditorGUILayout.TextField("", m_VersionTxt.resUrl); EditorGUILayout.LabelField("渠道:"); m_VersionTxt.channel = EditorGUILayout.TextField("", m_VersionTxt.channel); EditorGUILayout.LabelField("子渠道:"); m_VersionTxt.subChannel = EditorGUILayout.TextField("", m_VersionTxt.subChannel); EditorGUILayout.LabelField("包版本号:"); m_VersionTxt.packageVersion = EditorGUILayout.TextField("", m_VersionTxt.packageVersion); EditorGUILayout.LabelField("热更版本号:"); m_VersionTxt.version = EditorGUILayout.TextField("", m_VersionTxt.version); //EditorGUILayout.LabelField("公告:"); //m_VersionTxt.noticeChannel = EditorGUILayout.TextField("", m_VersionTxt.noticeChannel); EditorGUILayout.EndVertical(); if (GUILayout.Button("应用", GUILayout.Height(40f))) { SaveToEditorPath(); UnityEngine.Debug.Log("应用成功"); } EditorGUILayout.BeginVertical(); EditorGUILayout.Space(); EditorGUILayout.LabelField("请选择要使用的version文件:"); if (m_Files != null && m_Files.Length != 0) { for (int i = 0; i < m_Files.Length; i++) { m_Choose[i] = EditorGUILayout.ToggleLeft(Path.GetFileNameWithoutExtension(m_Files[i]), m_Choose[i]); } } else { EditorGUILayout.LabelField("未找到分支"); } EditorGUILayout.EndVertical(); if (GUILayout.Button("使用选中的version文件", GUILayout.Height(40f))) { for (int i = 0; i < m_Files.Length; i++) { if (m_Choose[i]) { LoadVersion(m_Files[i]); UnityEngine.Debug.Log("使用成功"); return; } } UnityEngine.Debug.Log("未找到可用的version"); } if (GUILayout.Button("保存到打包路径", GUILayout.Height(40f))) { SaveToBuildPath(); UnityEngine.Debug.Log("保存成功"); } } } }