#if UNITY_EDITOR using System; using System.Collections.Generic; using System.IO; using System.Reflection; using System.Text; using AlicizaX.UI.Runtime; using UnityEditor; using UnityEngine; using Object = UnityEngine.Object; namespace AlicizaX.UI.Editor { internal static class ScriptGenerator { private static UIGenerateGlobalSettings m_GenerateGlobalSetting; public static string UIGenerateGlobalSettingPath = $"Assets/AlicizaFramework/UISetting/UIGenerateGlobalSettings.asset"; const string RegisterUIHelper = "Assets/GameScripts/HotFix/GameLogic/Runtime/UI"; const string RegisterUIHelperMain = "Assets/GameScripts/Main/Launcher/Scripts"; #region 热更工程目录 //Bind文件存放根路径 const string BindComponetsSavePath = "Assets/GameScripts/HotFix/GameLogic/Runtime/UI/BindComponents"; //界面逻辑文件存放根路径 const string UILogicSavePath = "Assets/GameScripts/HotFix/GameLogic/Runtime/UI/View"; //预制体存放根路径 const string UIPrefabSavePath = "Assets/AssetRaw/UI"; public const string HotfixNameSpace = "GameLogic.UI"; #endregion #region 主工程目录 //Bind文件存放根路径 const string BindComponetsMainSavePath = "Assets/GameScripts/Main/Launcher/Scripts/UI/BindComponents"; //界面逻辑文件存放根路径 const string UILogicMainSavePath = "Assets/GameScripts/Main/Launcher/Scripts/UI/View"; //预制体存放根路径 const string UIPrefabMainSavePath = "Assets/GameScripts/Main/Launcher/Resources"; public const string MainNameSpace = "GameMain.UI"; #endregion static string WindowPrefabSavePath = Path.Combine(UIPrefabSavePath, "UIWindow"); static string WidgetPrefabSavePath = Path.Combine(UIPrefabSavePath, "UIWidget"); static string ViewPrefabSavePath = Path.Combine(UIPrefabSavePath, "UIView"); static string WindowBindSavePath = Path.Combine(BindComponetsSavePath, "Window"); static string WidgetBindSavePath = Path.Combine(BindComponetsSavePath, "Widget"); static string ViewBindSavePath = Path.Combine(BindComponetsSavePath, "View"); static string WindowLogicSavePath = Path.Combine(UILogicSavePath, "Window"); static string WidgetLogicSavePath = Path.Combine(UILogicSavePath, "Widget"); static string ViewLogicSavePath = Path.Combine(UILogicSavePath, "View"); static string ScriptsNameSpace = "GameLogic.UI"; static void SwitchHotFitRootPath(UIBindComponent bindComponent) { bool isHotfix = bindComponent.ResLoadType == EUIResLoadType.AssetBundle; WindowPrefabSavePath = Path.Combine(isHotfix ? UIPrefabSavePath : UIPrefabMainSavePath, "UIWindow"); WidgetPrefabSavePath = Path.Combine(isHotfix ? UIPrefabSavePath : UIPrefabMainSavePath, "UIWidget"); ViewPrefabSavePath = Path.Combine(isHotfix ? UIPrefabSavePath : UIPrefabMainSavePath, "UIView"); WindowBindSavePath = Path.Combine(isHotfix ? BindComponetsSavePath : BindComponetsMainSavePath, "Window"); WidgetBindSavePath = Path.Combine(isHotfix ? BindComponetsSavePath : BindComponetsMainSavePath, "Widget"); ViewBindSavePath = Path.Combine(isHotfix ? BindComponetsSavePath : BindComponetsMainSavePath, "View"); WindowLogicSavePath = Path.Combine(isHotfix ? UILogicSavePath : UILogicMainSavePath, "Window"); WidgetLogicSavePath = Path.Combine(isHotfix ? UILogicSavePath : UILogicMainSavePath, "Widget"); ViewLogicSavePath = Path.Combine(isHotfix ? UILogicSavePath : UILogicMainSavePath, "View"); ScriptsNameSpace = isHotfix ? HotfixNameSpace : MainNameSpace; } static void GenerateUIRegisterHelper(Assembly assembly, string path) { // 获取程序集中的所有类型 var types = assembly.GetTypes(); List eventTypes = new List(); // 遍历每个类型 foreach (Type type in types) { // 检查类型是否是接口 if (type.IsInterface) { continue; } var attribute = Attribute.GetCustomAttribute(type, typeof(WindowAttribute)) as WindowAttribute; if (attribute != null) { eventTypes.Add(type); } } var filePath = Path.Combine(path, "UIRegisterHelper.cs"); using (StreamWriter sw = new StreamWriter(filePath)) { sw.WriteLine("using AlicizaFramework;"); sw.WriteLine($"namespace {ScriptsNameSpace}"); sw.WriteLine("{"); sw.WriteLine("\tpublic static class UIRegisterHelper"); sw.WriteLine("\t{"); sw.WriteLine("\t\tpublic static void Initlize()"); sw.WriteLine("\t\t{\n"); foreach (var type in eventTypes) { sw.WriteLine($"\t\t\tUICacheRegister.Register<{type.FullName}>();\n"); } sw.WriteLine("\t\t}"); sw.WriteLine("\t}"); sw.WriteLine("}"); } } static void GenerateUIRegisterHelper() { // Assembly mainAssembly = Assembly.GetAssembly(typeof(DisStripCode)); // GenerateUIRegisterHelper(mainAssembly, RegisterUIHelperMain); // // Assembly hotfixAssembly = Assembly.GetAssembly(typeof(GameLogic.GameModule)); // GenerateUIRegisterHelper(hotfixAssembly, RegisterUIHelper); } public static UIGenerateGlobalSettings UIGenerateGlobalSetting { get { if (m_GenerateGlobalSetting == null) { m_GenerateGlobalSetting = AssetDatabase.LoadAssetAtPath(UIGenerateGlobalSettingPath); } return m_GenerateGlobalSetting; } } public static void GenerateUIPanelScript(UIBindComponent uiBindComponent) { SwitchHotFitRootPath(uiBindComponent); uiBindComponent.ScriptName = uiBindComponent.gameObject.name; if (uiBindComponent.ResLoadType == EUIResLoadType.Resources) { uiBindComponent.Location = "UI" + uiBindComponent.UIType + "/" + uiBindComponent.gameObject.name; } else { uiBindComponent.Location = uiBindComponent.gameObject.name; } if (uiBindComponent.UIType == UIType.Window) { SaveAllChildWidgets(uiBindComponent); CreateUIScript(uiBindComponent); CreateWndUIPrefab(uiBindComponent); } else { CreateUIWidgetScript(uiBindComponent); CreateWidgetUIPrefab(uiBindComponent); } GenerateUIRegisterHelper(); AssetDatabase.Refresh(); } private static void SaveAllChildWidgets(UIBindComponent uiBindComponent) { List childWidgets = new List(); CheckIsSaveWidget(uiBindComponent.transform, ref childWidgets); string CombineName = "包含多个组件\n"; foreach (var VARIABLE in childWidgets) { CombineName += VARIABLE.ScriptName + "\n"; } if (childWidgets.Count > 0) { bool result = EditorUtility.DisplayDialog( "Hello!", // 标题 CombineName, // 消息内容 "一起生成保存", // 确认按钮 "不保存子组件" // 取消按钮(可选) ); if (result) { foreach (var VARIABLE in childWidgets) { BindComponent(VARIABLE); GenerateUIPanelScript(VARIABLE); } } } } private static void CheckIsSaveWidget(Transform root, ref List childWidegt) { for (int i = 0; i < root.childCount; ++i) { Transform child = root.GetChild(i); if (child.name.IndexOf("widget", StringComparison.OrdinalIgnoreCase) >= 0) { UIBindComponent childWd = child.GetComponent(); if (childWd == null) { Debug.Log("Widget 不包含UIBindComponent 命名不正确" + child.name); } if (childWd && string.IsNullOrEmpty(childWd.ScriptName)) { Debug.Log("Widget 生成脚本名不正确 检查UIBindComponent " + child.name); } if (childWd && !string.IsNullOrEmpty(childWd.ScriptName)) { childWidegt.Add(childWd); } continue; } CheckIsSaveWidget(child, ref childWidegt); } } #region UIView private static void CreateUIViewScript(UIBindComponent uiBindComponent) { string logicFilePath = Path.Combine(ViewLogicSavePath, uiBindComponent.ScriptName + ".cs"); string bindFilePath = Path.Combine(ViewBindSavePath, uiBindComponent.ScriptName + ".BindComponents.cs"); string LogicText = GetWidgetLogicText(uiBindComponent); string bindText = GetWidgetBingComponentLogicText(uiBindComponent); if (!Directory.Exists(ViewBindSavePath)) { Directory.CreateDirectory(ViewBindSavePath); } if (!Directory.Exists(ViewLogicSavePath)) { Directory.CreateDirectory(ViewLogicSavePath); } File.WriteAllText(bindFilePath, bindText); File.WriteAllText(logicFilePath, LogicText); } public static void CreateWidgetUIPrefab(UIBindComponent uiBindComponent) { string prefabPath = Path.Combine(WidgetPrefabSavePath, uiBindComponent.ScriptName + ".prefab"); if (!Directory.Exists(WidgetPrefabSavePath)) { Directory.CreateDirectory(WidgetPrefabSavePath); } if (File.Exists(prefabPath)) { File.Delete(prefabPath); } if (uiBindComponent.gameObject) { RectTransform rectTransform = uiBindComponent.gameObject.GetComponent(); if (rectTransform != null) { // 修改RectTransform的锚点 rectTransform.localScale = Vector3.one; } } PrefabUtility.SaveAsPrefabAsset(uiBindComponent.gameObject, prefabPath); Debug.Log($"{uiBindComponent.ScriptName} Generate Succesd"); } #endregion #region UIWidget private static void CreateUIWidgetScript(UIBindComponent uiBindComponent) { string logicFilePath = Path.Combine(WidgetLogicSavePath, uiBindComponent.ScriptName + ".cs"); string bindFilePath = Path.Combine(WidgetBindSavePath, uiBindComponent.ScriptName + ".BindComponents.cs"); string LogicText = GetWidgetLogicText(uiBindComponent); string bindText = GetWidgetBingComponentLogicText(uiBindComponent); if (!Directory.Exists(WidgetBindSavePath)) { Directory.CreateDirectory(WidgetBindSavePath); } if (!Directory.Exists(WidgetLogicSavePath)) { Directory.CreateDirectory(WidgetLogicSavePath); } File.WriteAllText(bindFilePath, bindText); File.WriteAllText(logicFilePath, LogicText); } public static void CreateViewUIPrefab(UIBindComponent uiBindComponent) { string prefabPath = Path.Combine(ViewPrefabSavePath, uiBindComponent.ScriptName + ".prefab"); if (!Directory.Exists(ViewPrefabSavePath)) { Directory.CreateDirectory(ViewPrefabSavePath); } if (File.Exists(prefabPath)) { File.Delete(prefabPath); } if (uiBindComponent.gameObject) { RectTransform rectTransform = uiBindComponent.gameObject.GetComponent(); if (rectTransform != null) { // 修改RectTransform的锚点 rectTransform.localScale = Vector3.one; } } PrefabUtility.SaveAsPrefabAsset(uiBindComponent.gameObject, prefabPath); Debug.Log($"{uiBindComponent.ScriptName} Generate Succesd"); } private static string GetWidgetLogicText(UIBindComponent uiBindComponent) { string logicFilePath = Path.Combine(WidgetLogicSavePath, uiBindComponent.ScriptName + ".cs"); string logicRef = ""; if (File.Exists(logicFilePath)) { logicRef = File.ReadAllText(logicFilePath); } StringBuilder logicTextBuilder = new StringBuilder(); var hasLogic = logicRef.Length > 0; if (!hasLogic) { logicTextBuilder.Append("using UnityEngine;\n"); logicTextBuilder.Append("using AlicizaFramework;\n\n"); logicTextBuilder.Append($"namespace {ScriptsNameSpace}\n"); logicTextBuilder.Append("{\n"); logicTextBuilder.Append("\tpublic partial class " + uiBindComponent.ScriptName + " \n"); logicTextBuilder.Append("\t{\n"); logicTextBuilder.Append("\n"); logicTextBuilder.Append("\t\t#region UIBind事件\n"); logicTextBuilder.Append(GetCallBackText(uiBindComponent, logicRef)); logicTextBuilder.Append("\n"); logicTextBuilder.Append("\t\t#endregion\n\n"); logicTextBuilder.Append("\n\t}\n"); logicTextBuilder.Append("}\n"); } else { int index = logicRef.ToString().IndexOf("UIBind事件"); if (index != -1) { logicTextBuilder.Append(logicRef.Insert(index + 8, "\n" + GetCallBackText(uiBindComponent, logicRef))); } else { Debug.LogError("请检查该脚本自动生成关键字#region UIBind事件是否被去除!"); } } return logicTextBuilder.ToString(); } private static string GetWidgetBingComponentLogicText(UIBindComponent uiBindComponent) { StringBuilder bindComponetsBuilder = new StringBuilder(); bindComponetsBuilder.Append(GetRefrenceNameSpace(uiBindComponent)); bindComponetsBuilder.Append($"using AlicizaFramework;\n"); bindComponetsBuilder.Append($"namespace {ScriptsNameSpace}\n"); bindComponetsBuilder.Append("{\n"); bindComponetsBuilder.Append("\tpublic partial class " + uiBindComponent.ScriptName + $" : UIWidget\n"); bindComponetsBuilder.Append("\t{\n"); // 脚本工具生成的代码 bindComponetsBuilder.Append("\t\t#region 脚本工具生成的代码\n"); bindComponetsBuilder.Append(GetVarText(uiBindComponent)); bindComponetsBuilder.Append("\t\tprotected override void OnBindUIComponents()\n"); bindComponetsBuilder.Append("\t\t{\n"); bindComponetsBuilder.Append("\t\t\tInitBindComponent();\n"); bindComponetsBuilder.Append(GetBindText(uiBindComponent)); bindComponetsBuilder.Append(GetBindUIEvent(uiBindComponent)); bindComponetsBuilder.Append("\t\t}\n"); bindComponetsBuilder.Append("\t\t#endregion"); bindComponetsBuilder.Append("\n\t}\n"); bindComponetsBuilder.Append("}\n"); return bindComponetsBuilder.ToString(); } #endregion public static void CreateWndUIPrefab(UIBindComponent uiBindComponent) { string prefabPath = Path.Combine(WindowPrefabSavePath, uiBindComponent.ScriptName + ".prefab"); if (!Directory.Exists(WindowPrefabSavePath)) { Directory.CreateDirectory(WindowPrefabSavePath); } if (File.Exists(prefabPath)) { File.Delete(prefabPath); } if (uiBindComponent.gameObject) { var prefabClone = GameObject.Instantiate(uiBindComponent.gameObject, uiBindComponent.transform.parent); prefabClone.name = uiBindComponent.ScriptName; RemoveChildWidget(prefabClone.transform); RectTransform rectTransform = prefabClone.gameObject.GetComponent(); if (rectTransform != null) { // 修改RectTransform的锚点 rectTransform.pivot = new Vector2(0.5f, 0.5f); rectTransform.anchorMin = Vector2.zero; rectTransform.anchorMax = Vector2.one; rectTransform.offsetMin = Vector2.zero; rectTransform.offsetMax = Vector2.zero; rectTransform.localScale = Vector3.one; // rectTransform.anchoredPosition = Vector2.zero; // rectTransform.position = Vector3.zero; } PrefabUtility.SaveAsPrefabAsset(prefabClone.gameObject, prefabPath); Debug.Log($"{uiBindComponent.ScriptName} Generate Succesd"); Object.DestroyImmediate(prefabClone); } } private static void RemoveChildWidget(Transform root) { for (int i = 0; i < root.childCount; ++i) { Transform child = root.GetChild(i); if (child.name.IndexOf("widget", StringComparison.OrdinalIgnoreCase) >= 0) { Debug.Log("包含子Widget 移除保存" + child.name); GameObject.DestroyImmediate(child.gameObject); continue; } RemoveChildWidget(child); } } private static void CreateUIScript(UIBindComponent uiBindComponent) { string logicFilePath = Path.Combine(WindowLogicSavePath, uiBindComponent.ScriptName + ".cs"); string bindFilePath = Path.Combine(WindowBindSavePath, uiBindComponent.ScriptName + ".BindComponents.cs"); string LogicText = GetUILogicText(uiBindComponent); string bindText = GetUIBingComponentLogicText(uiBindComponent); string attributeResText = $"[UIRes(location: \"{uiBindComponent.Location}\" , EUIResLoadType.{uiBindComponent.ResLoadType})]\n"; string attributeText = $"\t[Window(UILayer.{uiBindComponent.UILayer}, fullScreen:{uiBindComponent.FullScreen.ToString().ToLower()} , delayedClose:{uiBindComponent.CacheDuration.ToString()})]\n"; bindText = bindText.Replace("#AttributeMark", attributeResText + attributeText); if (!Directory.Exists(WindowBindSavePath)) { Directory.CreateDirectory(WindowBindSavePath); } if (!Directory.Exists(WindowLogicSavePath)) { Directory.CreateDirectory(WindowLogicSavePath); } File.WriteAllText(bindFilePath, bindText); File.WriteAllText(logicFilePath, LogicText); } private static string GetUILogicText(UIBindComponent uiBindComponent, bool isHotfixProject = true) { string logicFilePath = Path.Combine(WindowLogicSavePath, uiBindComponent.ScriptName + ".cs"); string logicRef = ""; if (File.Exists(logicFilePath)) { logicRef = File.ReadAllText(logicFilePath); } StringBuilder logicTextBuilder = new StringBuilder(); var hasLogic = logicRef.Length > 0; if (!hasLogic) { logicTextBuilder.Append("using UnityEngine;\n"); logicTextBuilder.Append("using AlicizaFramework;\n\n"); logicTextBuilder.Append($"namespace {ScriptsNameSpace}\n"); logicTextBuilder.Append("{\n"); logicTextBuilder.Append("\tpartial class " + uiBindComponent.ScriptName + " \n"); logicTextBuilder.Append("\t{\n"); logicTextBuilder.Append("\n"); logicTextBuilder.Append("\t\t#region UIBind事件\n"); logicTextBuilder.Append(GetCallBackText(uiBindComponent, logicRef)); logicTextBuilder.Append("\n"); logicTextBuilder.Append("\t\t#endregion\n\n"); logicTextBuilder.Append(GetLogicLifeText(uiBindComponent)); logicTextBuilder.Append("\n\t}\n"); logicTextBuilder.Append("}\n"); } else { int index = logicRef.ToString().IndexOf("UIBind事件"); if (index != -1) { logicTextBuilder.Append(logicRef.Insert(index + 8, "\n" + GetCallBackText(uiBindComponent, logicRef))); } else { logicTextBuilder.Append(logicRef.ToString()); Debug.LogWarning("该脚本自动生成关键字#region UIBind事件被去除 不进行追加UI事件"); } } return logicTextBuilder.ToString(); } /// /// 构建部分类 xxxUI.BindComponetns /// /// /// /// private static string GetUIBingComponentLogicText(UIBindComponent uiBindComponent, bool isHotfixProject = true) { StringBuilder bindComponetsBuilder = new StringBuilder(); bindComponetsBuilder.Append(GetRefrenceNameSpace(uiBindComponent)); bindComponetsBuilder.Append($"using AlicizaFramework;\n"); bindComponetsBuilder.Append($"namespace {ScriptsNameSpace}\n"); bindComponetsBuilder.Append("{\n"); bindComponetsBuilder.Append("\t#AttributeMark"); bindComponetsBuilder.Append("\tpartial class " + uiBindComponent.ScriptName + " : UIWindow\n"); bindComponetsBuilder.Append("\t{\n"); // 脚本工具生成的代码 bindComponetsBuilder.Append("\t\t#region 脚本工具生成的代码\n"); bindComponetsBuilder.Append(GetVarText(uiBindComponent)); bindComponetsBuilder.Append("\t\tprotected override void OnBindUIComponents()\n"); bindComponetsBuilder.Append("\t\t{\n"); bindComponetsBuilder.Append("\t\t\tInitBindComponent();\n"); bindComponetsBuilder.Append(GetBindText(uiBindComponent)); bindComponetsBuilder.Append(GetBindUIEvent(uiBindComponent)); bindComponetsBuilder.Append("\t\t}\n"); bindComponetsBuilder.Append("\t\t#endregion"); bindComponetsBuilder.Append("\n\t}\n"); bindComponetsBuilder.Append("}\n"); return bindComponetsBuilder.ToString(); } /// /// 获取所有组件的对应命名空间引用 /// /// /// private static string GetRefrenceNameSpace(UIBindComponent uiBindComponent) { StringBuilder refrenceNameSpaceBuilder = new StringBuilder(); List nameSpaces = new List(); for (int i = 0; i < uiBindComponent.bindComponents.Count; i++) { var nameSpace = uiBindComponent.Elements[i].BindCom.GetType().Namespace; if (!nameSpaces.Contains(nameSpace)) { nameSpaces.Add(nameSpace); refrenceNameSpaceBuilder.Append($"using {nameSpace};\n"); } } return refrenceNameSpaceBuilder.ToString(); } /// /// 获取所有绑定组件的引用 /// /// /// private static string GetBindText(UIBindComponent uiBindComponent) { StringBuilder bindTextBuilder = new StringBuilder(); for (int i = 0; i < uiBindComponent.bindComponents.Count; i++) { var varName = uiBindComponent.Elements[i].Name; var varType = uiBindComponent.Elements[i].BindCom.GetType().Name; switch (varType) { case "GameObject": bindTextBuilder.Append( $"\t\t\t{varName} = FChild<{varType}>({i}).gameObject;\n"); break; case "RichItemIcon": bindTextBuilder.Append( $"\t\t\t{varName} = CreateWidgetByType<{varType}>(FChild(\"{varName}\"));\n"); break; case "RedNoteWidget": break; case "TextButtonItem": case "SwitchTabItem": case "UIActorWidget": case "UIEffectWidget": case "UISpineWidget": case "UIMainPlayerWidget": bindTextBuilder.Append( $"\t\t\t{varName} = CreateWidget<{varType}>(FChild(\"{varName}\").gameObject);\n"); break; default: bindTextBuilder.Append( $"\t\t\t{varName} = FChild<{varType}>({i});\n"); break; } } return bindTextBuilder.ToString(); } /// /// 获取所有组件的引用 /// /// /// private static string GetVarText(UIBindComponent uiBindComponent) { StringBuilder varTextBuilder = new StringBuilder(); for (int i = 0; i < uiBindComponent.bindComponents.Count; i++) { var varName = uiBindComponent.Elements[i].Name; varTextBuilder.Append("\t\tprivate " + uiBindComponent.Elements[i].BindCom.GetType().Name + " " + varName + ";\n"); } return varTextBuilder.ToString(); } /// /// 获取所有组件的绑定事件 /// /// /// private static string GetBindUIEvent(UIBindComponent uiBindComponent) { StringBuilder bingUIEventBuilder = new StringBuilder(); for (int i = 0; i < uiBindComponent.bindComponents.Count; i++) { var varName = uiBindComponent.Elements[i].SplitName; var comName = uiBindComponent.Elements[i].Name; var varType = uiBindComponent.Elements[i].BindCom.GetType().Name; if (varType == "Button" || varType == "UIButtonSuper" || varType == "UIButtonSuperText") { string varFuncName = GetBtnFuncName(varName); bingUIEventBuilder.Append($"\t\t\t{comName}.onClick.AddListener({varFuncName});\n"); } else if (varType == "Toggle") { string varFuncName = GetToggleFuncName(varName); bingUIEventBuilder.Append($"\t\t\t{comName}.onValueChanged.AddListener({varFuncName});\n"); } else if (varType == "Slider") { string varFuncName = GetSliderFuncName(varName); bingUIEventBuilder.Append($"\t\t\t{comName}.onValueChanged.AddListener({varFuncName});\n"); } } return bingUIEventBuilder.ToString(); } /// /// 获取所有组件的绑定回调 /// /// /// /// private static string GetCallBackText(UIBindComponent uiBindComponent, string logicRef) { StringBuilder callBackText = new StringBuilder(); for (int i = 0; i < uiBindComponent.bindComponents.Count; i++) { var varName = uiBindComponent.Elements[i].SplitName; var varType = uiBindComponent.Elements[i].BindCom.GetType().Name; if (varType == "Button" || varType == "UIButtonSuper" || varType == "UIButtonSuperText") { string varFuncName = GetBtnFuncName(varName); if (!logicRef.Contains(varFuncName)) { callBackText.Append($"\t\tprivate void {varFuncName}()\n"); callBackText.Append("\t\t{\n\t\t}\n"); } } else if (varType == "Toggle") { string varFuncName = GetToggleFuncName(varName); if (!logicRef.Contains(varFuncName)) { callBackText.Append($"\t\tprivate void {varFuncName}(bool isOn)\n"); callBackText.Append("\t\t{\n\t\t}\n"); } } else if (varType == "Slider") { string varFuncName = GetSliderFuncName(varName); if (!logicRef.Contains(varFuncName)) { callBackText.Append($"\t\tprivate void {varFuncName}(float valFue)\n"); callBackText.Append("\t\t{\n\t\t}\n"); } } } return callBackText.ToString(); } /// /// 构建脚本生命周期 /// /// /// private static string GetLogicLifeText(UIBindComponent uiBindComponent) { StringBuilder lifeTextBuilder = new StringBuilder(); //觉得还是没有必要加 需要哪个自己override吧 // lifeTextBuilder.Append("\t\t#region 生命周期事件\n"); // lifeTextBuilder.Append($"\t\tprotected override void OnInitlize()\n"); // lifeTextBuilder.Append("\t\t{\n"); // lifeTextBuilder.Append("\t\t\tbase.OnInitlize();\n"); // lifeTextBuilder.Append("\t\t}\n"); // lifeTextBuilder.Append($"\t\tprotected override void OnOpen()\n"); // lifeTextBuilder.Append("\t\t{\n"); // lifeTextBuilder.Append("\t\t\tbase.OnOpen();\n"); // lifeTextBuilder.Append("\t\t}\n"); // lifeTextBuilder.Append($"\t\tprotected override void OnUpdate()\n"); // lifeTextBuilder.Append("\t\t{\n"); // lifeTextBuilder.Append("\t\t\tbase.OnUpdate();\n"); // lifeTextBuilder.Append("\t\t}\n"); // lifeTextBuilder.Append($"\t\tprotected override void OnClose()\n"); // lifeTextBuilder.Append("\t\t{\n"); // lifeTextBuilder.Append("\t\t\tbase.OnClose();\n"); // lifeTextBuilder.Append("\t\t}\n"); // lifeTextBuilder.Append($"\t\tprotected override void OnDispose()\n"); // lifeTextBuilder.Append("\t\t{\n"); // lifeTextBuilder.Append("\t\t\tbase.OnDispose();\n"); // lifeTextBuilder.Append("\t\t}\n"); // lifeTextBuilder.Append("\t\t#endregion\n\n"); return lifeTextBuilder.ToString(); } /// /// 绑定组件 /// /// public static void BindComponent(UIBindComponent bindComponent) { List bindDatas = new List(); CollectComponet(bindComponent.transform, ref bindDatas); bindComponent.bindComponents.Clear(); foreach (var bindData in bindDatas) { bindComponent.bindComponents.Add(bindData.BindCom); } bindComponent.Elements = bindDatas; } /// /// 收集组件 /// /// /// private static void CollectComponet(Transform root, ref List bingDatas) { for (int i = 0; i < root.childCount; ++i) { Transform child = root.GetChild(i); if (child.name.IndexOf("widget", StringComparison.OrdinalIgnoreCase) >= 0) { Debug.Log("包含子Widget 如非Widget组件 请避开命名 路径" + child.name); continue; } string[] comArray = SplitComName(child.name); if (comArray != null) { string splitName = child.name.Substring(child.name.IndexOf("@") + 1); foreach (var com in comArray) { var typeName = GetVerType(com); var component = child.GetComponent(typeName); var keyName = GetKeyName(com, child.name); if (bingDatas.Find(a => a.Name == keyName) != null) { Debug.LogError("有重复的key:" + keyName); continue; } if (component == null) { Debug.LogError($"{child.name}没有{typeName}组件"); continue; } bingDatas.Add(new UIBindComponent.UIBindData(keyName, component, splitName)); } } CollectComponet(child, ref bingDatas); } } private static string[] SplitComName(string name) { bool hasCom = name.Contains("@"); if (!hasCom) return null; string comStr = name.Substring(0, name.IndexOf("@")); string[] comArray = comStr.Split("#"); return comArray; } private static string GetKeyName(string comName, string Key) { return $"m{comName}{Key.Substring(Key.IndexOf("@") + 1)}"; } /// /// 情况所有组件 /// /// public static void ClearBindComponets(UIBindComponent bindComponent) { bindComponent.bindComponents.Clear(); bindComponent.Elements.Clear(); } /// /// 清楚空引用 /// /// public static void ClearNullRefrence(UIBindComponent bindComponent) { for (var index = bindComponent.Elements.Count - 1; index >= 0; index--) { if (bindComponent.Elements[index].BindCom == null) { bindComponent.Elements.RemoveAt(index); } } bindComponent.bindComponents.Clear(); foreach (var VARIABLE in bindComponent.Elements) { bindComponent.bindComponents.Add(VARIABLE.BindCom); } } private static string GetBtnFuncName(string varName) { return $"OnBtn{varName}Click"; } private static string GetToggleFuncName(string varName) { return "OnToggle" + varName + "Change"; } private static string GetSliderFuncName(string varName) { return "OnSlider" + varName + "Change"; } private static string GetVerType(string uiName) { foreach (var pair in UIGenerateGlobalSetting.scriptGenerateRule) { if (uiName.StartsWith(pair.uiElementRegex)) { return pair.componentName; } } return string.Empty; } private static string GetUIBindDataPrefix(string uiName) { foreach (var pair in UIGenerateGlobalSetting.scriptGenerateRule) { if (uiName.StartsWith(pair.uiElementRegex)) { return pair.uiElementRegex; } } return string.Empty; } } } #endif