using UnityEditor; using UnityEngine; using System.Collections.Generic; using System.IO; using Cysharp.Threading.Tasks; using System; using AutoConfig; using Luban.Editor; using UnityEngine.Networking; public class ConfigInfo { public string Name; public string DocID; public bool Check; } public class DownloadConfigData { public string excelName; public bool isDone { get { return downloader.isFinished; } } public WPExcelDownloader downloader; } public class ConfigWindow : EditorWindow { private List m_Configs; private bool ExportClient; private bool ExportServer; private bool NeedDownload; private bool _isGenMixKey; private bool _isDownloading; private Vector2 scrollPosition = Vector2.zero; private Vector2 _scrollPositionDownload = Vector2.zero; private string cookie; const string DATA_TABLE_ASSEMBLY_REFERENCE_PATH = "Assets/Code/Scripts/Gameplay/DataTable/FrameWork.asmref"; const string DATA_TABLE_OUTSIDE_ASSEMBLY_REFERENCE_PATH = "Assets/Code/Scripts/Gameplay/FrameWork.asmref"; public const string DATA_STRING_LOCALIZE_CN = "Assets/Config/Data/Localize/CN"; public const string DATA_STRING_LOCALIZE_EN = "Assets/Config/Data/Localize/EN"; /// /// 0 未知 /// 1 checking /// 2 ok /// 3 failed /// private int _authState = 0; public static void ShowWindow() { var window = GetWindow(); window.titleContent = new GUIContent("自动化配置工具"); window.maximized = false; window.minSize = new Vector2(300, 300); int width = 600; int height = 400; var x = (Screen.currentResolution.width - width) / 2; var y = (Screen.currentResolution.height - height) / 2; Rect centerRect = new Rect(x, y, width, height); window.position = centerRect; window._authState = 0; window.InitData(); window.Show(); window.Focus(); } public void InitData() { var dir = new DirectoryInfo(ConfigTools.CONFIG_DIR); var combiePath = dir.FullName + "Datas/AConfigList.xlsx"; // var configPath = ConfigTools.CONFIG_DIR + "/config_list.txt"; // var lines = File.ReadAllLines(configPath); m_Configs = new List(); if (File.Exists(combiePath)) { var excelDataList = ReadExcelList.ReadList(combiePath); for (var i = 0; i < excelDataList.Count; i++) { var lineData = excelDataList[i]; var docName = lineData.excelName; var docId = lineData.docId; ConfigInfo ci = new ConfigInfo(); ci.Name = docName; ci.DocID = docId; ci.Check = true; m_Configs.Add(ci); } m_Configs.Sort((a, b) => a.Name.CompareTo(b.Name)); } else { Debug.LogError($"配置文件不存在,path={combiePath}"); } ExportClient = true; ExportServer = false; _isGenMixKey = false; NeedDownload = true; cookie = EditorPrefs.GetString("ConfCookie", ""); } void OnGUI() { if (m_Configs == null) { InitData(); } _OnGUIContent(); } private async void _StartChecking() { if (string.IsNullOrEmpty(cookie)) return; _authState = 1; var downLoader = new WPExcelDownloader("AConfigList.xlsx", "e3_AXoAQAavAFIi9riMuy9Q5CMxcHei1", cookie);//e3_AQIA8QbmAKEFwoGRFPhT9uizRsOaA Debug.Log("开始检查授权"); var checkResult = await downLoader.OnlyCheck(); if (checkResult) { Debug.Log("授权成功"); _authState = 2; } else { Debug.LogError("授权失败"); _authState = 3; } } private void _ShowSIDConfig() { cookie = EditorGUILayout.TextField("Cookie:", cookie); GUILayout.BeginHorizontal(); if (GUILayout.Button("重新检查授权")) { _StartChecking(); } if (GUILayout.Button("打开授权网页")) { _OpenAuthWindow(); } GUILayout.EndHorizontal(); } private void _OpenAuthWindow() { var url = "https://doc.weixin.qq.com/sheet/e3_AXoAQAavAFI2YSsTvvuQ9aS06iieP"; Application.OpenURL(url); } private async void _RefreshList() { await ConfigTools.DownloadConfig(cookie); InitData(); } private void _ShowAuthState() { switch (_authState) { case 0: // 未知 if (string.IsNullOrEmpty(cookie)) { // 未配置 EditorGUILayout.HelpBox("请先配置sid和cookie", MessageType.Error); _ShowSIDConfig(); } else { // 已配置 _ShowSIDConfig(); _StartChecking(); } break; case 1: EditorGUILayout.HelpBox("检查授权中", MessageType.Warning); _ShowSIDConfig(); break; case 2: EditorGUILayout.HelpBox("授权成功", MessageType.Info); _ShowSIDConfig(); break; case 3: EditorGUILayout.HelpBox("授权失败", MessageType.Error); _ShowSIDConfig(); break; } } private void _ShowRefreshConfigList() { GUILayout.BeginHorizontal(); if (GUILayout.Button("刷新Config List")) { EditorPrefs.SetString("ConfCookie", cookie); _RefreshList(); } if (GUILayout.Button("打开excel所在路径")) { var openPath = ConfigTools.CONFIG_DIR + "Datas/"; EditorUtility.RevealInFinder(openPath); } GUILayout.EndHorizontal(); } private void _ShowExcelList() { scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition); for (int i = 0; i < m_Configs.Count; i++) { var excelName = m_Configs[i].Name; m_Configs[i].Check = EditorGUILayout.ToggleLeft(excelName, m_Configs[i].Check); } EditorGUILayout.EndScrollView(); GUILayout.BeginHorizontal(); if (GUILayout.Button("全选")) { for (int i = 0; i < m_Configs.Count; i++) { m_Configs[i].Check = true; } } if (GUILayout.Button("全不选")) { for (int i = 0; i < m_Configs.Count; i++) { m_Configs[i].Check = false; } } GUILayout.EndHorizontal(); GUILayout.Space(10); EditorGUILayout.BeginHorizontal(); ExportClient = EditorGUILayout.ToggleLeft("导出客户端", ExportClient); ExportServer = EditorGUILayout.ToggleLeft("导出服务端", ExportServer); EditorGUILayout.EndHorizontal(); GUILayout.Space(10); EditorGUILayout.BeginHorizontal(); _isGenMixKey = EditorGUILayout.ToggleLeft("导出时生成MixKey", _isGenMixKey); GUILayout.Space(10); NeedDownload = EditorGUILayout.ToggleLeft("下载选中配置", NeedDownload); GUILayout.EndHorizontal(); } private void _ShowGenBtn() { GUILayout.BeginHorizontal(); string buttonName = "开始"; if (NeedDownload) { buttonName += " 【下载配置】"; } if (ExportClient) { buttonName += " 【导出到 Client】"; } if (ExportServer) { buttonName += " 【导出到 Server】"; } if (GUILayout.Button(buttonName)) { if (string.IsNullOrEmpty(cookie)) { EditorUtility.DisplayDialog("配置工具", "请先配置sid和cookie", "OK"); return; } PlayerPrefs.SetString("ConfCookie", cookie); _AsyncAction(); } GUILayout.EndHorizontal(); } private void _OnGUIContent() { GUILayout.Space(10); _ShowAuthState(); _ShowRefreshConfigList(); GUILayout.Space(10); EditorGUILayout.BeginHorizontal(); GUILayout.Label("配置列表:", EditorStyles.boldLabel); GUILayout.Label("共计:" + m_Configs.Count); EditorGUILayout.EndHorizontal(); if (_isDownloading) { EditorGUILayout.HelpBox("正在下载中,请稍后", MessageType.Warning); _ShowDonwloadExcels(); } else { _ShowExcelList(); GUILayout.Space(10); _ShowGenBtn(); } GUILayout.Space(10); if (GUILayout.Button("生成MixKey配置")) { _GenMixKeyConfig(); //GenMixKeyTool.ReplaceMixKey(); } } private void _ShowDonwloadExcels() { var configList = DownloadConfig.downloadConfigs; _scrollPositionDownload = GUILayout.BeginScrollView(_scrollPositionDownload); for (int i = 0; i < configList.Count; i++) { var config = configList[i]; GUILayout.BeginHorizontal(); GUILayout.Label(config.excelName, GUILayout.Width(200)); if (config.isDone) { if (config.downloader.isCanceled) { GUILayout.Label("取消下载", GUILayout.Width(100)); } else if (!config.downloader.isDownloaded) { GUILayout.Label("下载失败", GUILayout.Width(100)); } else { GUILayout.Label("下载完成", GUILayout.Width(100)); } } else { GUILayout.Label("下载中", GUILayout.Width(100)); if (GUILayout.Button("取消下载")) { config.downloader.Cancel(); } } GUILayout.EndHorizontal(); } GUILayout.EndScrollView(); if (GUILayout.Button("全部取消", GUILayout.Height(40))) { for (int i = 0; i < configList.Count; i++) { var config = configList[i]; if (config.isDone) { continue; } config.downloader.Cancel(); } } } private void MoveDataTableAssemblyReference(bool isOut) { if (isOut) AssetDatabase.MoveAsset(DATA_TABLE_ASSEMBLY_REFERENCE_PATH, DATA_TABLE_OUTSIDE_ASSEMBLY_REFERENCE_PATH); else AssetDatabase.MoveAsset(DATA_TABLE_OUTSIDE_ASSEMBLY_REFERENCE_PATH, DATA_TABLE_ASSEMBLY_REFERENCE_PATH); } private async void _AsyncAction() { bool needDownload = false; for (int i = 0; i < m_Configs.Count; i++) { if (m_Configs[i].Check) needDownload = true; } if (needDownload && NeedDownload) { _isDownloading = true; await DownloadConfig.AutoProcessConfig(m_Configs, cookie); _isDownloading = false; } else { Debug.Log("当前没有需要下载的配置,已跳过"); } await UniTask.Delay(100); if (ExportClient) { var lubanAsset = AssetDatabase.LoadAssetAtPath("Assets/Editor/Tools/Luban_Client.asset"); var lubanLocalizeCNAsset = AssetDatabase.LoadAssetAtPath("Assets/Editor/Tools/Luban_Client_CN.asset"); var lubanLocalizeENAsset = AssetDatabase.LoadAssetAtPath("Assets/Editor/Tools/Luban_Client_EN.asset"); var genSuccess = lubanAsset.Gen(); var genCNSuccess = lubanLocalizeCNAsset.Gen(); var genENSuccess = lubanLocalizeENAsset.Gen(); _ClearLocalizeDir(); if (genSuccess && _isGenMixKey) { _GenMixKeyConfig(); } } if (ExportServer) { var lubanAsset = AssetDatabase.LoadAssetAtPath("Assets/Editor/Tools/Luban_Server.asset"); lubanAsset.Gen(); } } private void _GenMixKeyConfig() { //GenMixKeyTool.GenMixKeyFile(); MixKeyGenJson.IsGenJsonProcess = true; GenMixKeyTool.GenMixKeyJson(); } /// /// 清理本地化生成的无用json文件 /// private void _ClearLocalizeDir() { if (Directory.Exists(DATA_STRING_LOCALIZE_CN)) { foreach (var file in Directory.GetFileSystemEntries(DATA_STRING_LOCALIZE_CN)) { if (!file.Contains("stringcfg")) { File.Delete(file); } } } if (Directory.Exists(DATA_STRING_LOCALIZE_EN)) { foreach (var file in Directory.GetFileSystemEntries(DATA_STRING_LOCALIZE_EN)) { if (!file.Contains("stringcfg")) { File.Delete(file); } } } AssetDatabase.Refresh(); } }