using Cysharp.Threading.Tasks; using System; using System.Collections.Generic; using System.Globalization; using System.IO; using System.Linq; using UnityEditor; using UnityEngine; namespace AutoConfig { public class GenMixKeyTool { public static readonly string CfgPath = Application.dataPath + "/../../../NLDMisc/config/Datas/"; public static readonly string StringConfigPath = "StringConfig.xlsx";//"StringLocalizeConfig.xlsx"; private static string Config_MixKey_Path = @"Assets/Code/Scripts/Framework/Data/MixKey/MixKeyConfig.cs"; private const string Config_MixKey_Name = "MixKeyConfig.cs"; static string _cfgName = ""; static List _keyList = new List(); //Key字段,所有Key的列表 static List _keyIdxList = new List(); //Value字段的索引列表 static string _param = ""; private static int _listIdx = 0; //如果值是一个 private static bool _isPer; private static int _process; private static List _stringCfgMixValueList; public static int LoadCfgProcess => _process; //配置内容分段枚举 private enum KeyPart { Cfg, Key, Value, Param, //参数字段名 ListIdx, //参数若为List,取第几位,从0开始 IsPer, //是否百分比 Max //无意义,仅作为上限值 } private Dictionary _tempDic = new() { ["cfg_key0/key1_value0/value1_paramName_listIdx_isPer(0/1)"] = "1", }; private static bool IsFileExit() { return File.Exists(Config_MixKey_Path); } #region 获取Cell内对应配置内容 //获取Key对应Value public static string GetValue(string fullKey) { ParseContent(fullKey); var val = GetValueString(fullKey); return val; } /// /// 解析配置的Key内容 /// /// private static void ParseContent(string fullContent) { var strList = fullContent.Split('_'); if (strList.Length != (int)KeyPart.Max) { DebugUtil.LogError($"StringConfig中配置的索引参数内容有误, Key:{fullContent} "); return; } Release(); for (var i = KeyPart.Cfg; i < KeyPart.Max; i++) { var str = strList[(int)i]; switch (i) { case KeyPart.Cfg: { _cfgName = str; break; } case KeyPart.Key: { var keyStrL = str.Split('/'); _keyList = keyStrL.ToList(); break; } case KeyPart.Value: { var keyStrL = str.Split('/'); _keyIdxList = keyStrL.ToList(); break; } case KeyPart.Param: { _param = str; break; } case KeyPart.ListIdx: { _listIdx = int.Parse(str); break; } case KeyPart.IsPer: { _isPer = str == "1"; break; } default: break; } } } private static string GetValueString(string fullKey) { var keyLineIdxList = ExcelRead.GetValueIndexList(_cfgName, _keyList); try { var val = ExcelRead.GetStringValByIndex(_cfgName, _param, keyLineIdxList, _keyIdxList, _listIdx); if (val == null) { DebugUtil.LogError($"FullKey:{fullKey}, cfgName:{_cfgName}, param:{_param}"); return ""; } if (_isPer) { float value = Math.Abs(float.Parse(val)); val = $"{value:P}"; val = val.Replace(".00", ""); } else { if(int.TryParse(val, out var valueInt)) { val = valueInt.ToString(); } else if(float.TryParse(val, out var valueFloat)) { val = valueFloat.ToString(CultureInfo.InvariantCulture); } } if (val.Contains(",")) { val = val.Replace(",", ""); } if (val.Contains(",")) { val = val.Replace(",", ""); } return val; } catch (Exception e) { DebugUtil.LogError($"FullKey:{fullKey}, cfgName:{_cfgName}, param:{_param}"); DebugUtil.LogError(e); return ""; } } private static async UniTask LoadMixValue() { ExcelRead.InitAll(); ExcelRead.LoadStrCfgMixKeyList(); var keyList = ExcelRead.StringCfgMixKeyList; ExcelRead.StringCfgMixValueList.Clear(); _process = 0; for (int i = 0 ; i < keyList.Count; i++) { await UniTask.Delay(1); _process++; var key = keyList[i]; var val = GetValue(key); ExcelRead.StringCfgMixValueList.Add(val); _ShowGenMixKeyProcess(); } Release(); EditorUtility.ClearProgressBar(); } private static void _ShowGenMixKeyProcess() { var strInfo = LoadCfgProcess + "/" + ExcelRead.StringCfgMixKeyList.Count; float process = (float)LoadCfgProcess / ExcelRead.StringCfgMixKeyList.Count; EditorUtility.DisplayProgressBar("MixKey生成中", strInfo, process); } #endregion /// /// 生成文件内容 /// /// private static bool WriteFileStr() { StreamWriter fWriter = null; try { fWriter = File.CreateText(Config_MixKey_Path); } catch (Exception e) { Debug.LogException(e); } if (fWriter == null) { Debug.LogError($"不存在文件{Config_MixKey_Name}, 路径:{Config_MixKey_Path}"); return false; } string startStr = ""; startStr += "using System.Collections.Generic;\n"; startStr += "public class MixKeyConfig\n{\n\t"; startStr += "public static Dictionary MixKeyDic = new()\n\t{\n\t\t"; fWriter.Write(startStr); var keyList = ExcelRead.StringCfgMixKeyList; var valList = _stringCfgMixValueList; if (keyList.Count != valList.Count) { DebugUtil.LogError("Key, Value长度不等,请检查!!!"); } for (int i = 0; i < keyList.Count; i++) { string contentStr = ""; var keyContent = keyList[i]; var valContent = valList[i]; contentStr += "[\""+ keyContent + "\"] = \"" + valContent + "\","; if (i < keyList.Count - 1) { contentStr += "\n\t\t"; } fWriter.Write(contentStr); } string endStr = "\n\t};\n}"; fWriter.Write(endStr); fWriter.Close(); return true; } private static void ClearFile() { FileStream stream = File.Open(Config_MixKey_Path, FileMode.OpenOrCreate, FileAccess.Write); stream.Seek(0, SeekOrigin.Begin); stream.SetLength(0); stream.Close(); } private static void DetectFile() { ClearFile(); AssetDatabase.Refresh(); } public static void GenMixKeyFile() { LoadMixValue(); DetectFile(); if (WriteFileStr()) { DebugUtil.Log("生成MixKey配置成功!!!"); return; } DebugUtil.Log("生成MixKey配置失败!!!"); } public static async void GenMixKeyJson() { await LoadMixValue(); MixKeyGenJson.GenMixKeyJsonFile(); } public static void Release() { _cfgName = ""; _keyList.Clear(); _keyIdxList.Clear(); _param = ""; _isPer = false; ExcelRead.ReleaseAll(); } } }