From fb9846d10c45f4322212c23dac92395aa1208e9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=80=9D=E6=B5=B7?= <1464576565@qq.com> Date: Mon, 23 Mar 2026 14:45:12 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.更改了UXController相关的命名空间 2.增加UXController相关的UI生成接口 --- Editor/UX/Controller/UXBindingEditor.cs | 2 +- Editor/UX/Controller/UXControllerEditor.cs | 2 +- .../UXControllerSceneOverlayWindow.cs | 2 +- .../UXControllerUIScriptFileWriter.cs | 66 +++++++++++++++++++ .../UXControllerUIScriptFileWriter.cs.meta | 3 + Runtime/UXComponent/Controller/UXBinding.cs | 2 +- .../Controller/UXBindingPropertyUtility.cs | 4 +- .../UXComponent/Controller/UXController.cs | 19 +++++- 8 files changed, 92 insertions(+), 8 deletions(-) create mode 100644 Editor/UX/Controller/UXControllerUIScriptFileWriter.cs create mode 100644 Editor/UX/Controller/UXControllerUIScriptFileWriter.cs.meta diff --git a/Editor/UX/Controller/UXBindingEditor.cs b/Editor/UX/Controller/UXBindingEditor.cs index 40b605e..6bf74a1 100644 --- a/Editor/UX/Controller/UXBindingEditor.cs +++ b/Editor/UX/Controller/UXBindingEditor.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using UnityEditor; using UnityEngine; -namespace AlicizaX.UI +namespace UnityEngine.UI { [CustomEditor(typeof(UXBinding))] public sealed class UXBindingEditor : UnityEditor.Editor diff --git a/Editor/UX/Controller/UXControllerEditor.cs b/Editor/UX/Controller/UXControllerEditor.cs index 16a0fbb..d4e2a90 100644 --- a/Editor/UX/Controller/UXControllerEditor.cs +++ b/Editor/UX/Controller/UXControllerEditor.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using UnityEditor; using UnityEngine; -namespace AlicizaX.UI +namespace UnityEngine.UI { [CustomEditor(typeof(UXController))] public sealed class UXControllerEditor : UnityEditor.Editor diff --git a/Editor/UX/Controller/UXControllerSceneOverlayWindow.cs b/Editor/UX/Controller/UXControllerSceneOverlayWindow.cs index 14b9c0c..32cb194 100644 --- a/Editor/UX/Controller/UXControllerSceneOverlayWindow.cs +++ b/Editor/UX/Controller/UXControllerSceneOverlayWindow.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using UnityEditor; using UnityEngine; -namespace AlicizaX.UI +namespace UnityEngine.UI { public sealed class UXControllerSceneOverlayWindow : EditorWindow { diff --git a/Editor/UX/Controller/UXControllerUIScriptFileWriter.cs b/Editor/UX/Controller/UXControllerUIScriptFileWriter.cs new file mode 100644 index 0000000..b5f2878 --- /dev/null +++ b/Editor/UX/Controller/UXControllerUIScriptFileWriter.cs @@ -0,0 +1,66 @@ +using System; +using System.IO; +using System.Text; +using AlicizaX.UI.Editor; +using UnityEditor; + +namespace UnityEngine.UI +{ + public sealed class UXControllerUIScriptFileWriter : IUIScriptFileWriter + { + public void Write(GameObject targetObject, string className, string scriptContent, UIScriptGenerateData scriptGenerateData) + { + if (string.IsNullOrEmpty(className)) throw new ArgumentNullException(nameof(className)); + if (scriptContent == null) throw new ArgumentNullException(nameof(scriptContent)); + if (scriptGenerateData == null) throw new ArgumentNullException(nameof(scriptGenerateData)); + + var scriptFolderPath = scriptGenerateData.GenerateHolderCodePath; + var scriptFilePath = Path.Combine(scriptFolderPath, $"{className}.cs"); + + Directory.CreateDirectory(scriptFolderPath); + scriptContent = scriptContent.Replace("#Controller#", GetControllerContent(targetObject)); + + if (File.Exists(scriptFilePath) && IsContentUnchanged(scriptFilePath, scriptContent)) + { + UIScriptGeneratorHelper.BindUIScript(); + return; + } + + File.WriteAllText(scriptFilePath, scriptContent, Encoding.UTF8); + AssetDatabase.Refresh(); + } + + private static bool IsContentUnchanged(string filePath, string newContent) + { + var oldText = File.ReadAllText(filePath, Encoding.UTF8); + return oldText.Equals(newContent, StringComparison.Ordinal); + } + + private static string GetControllerContent(GameObject targetObject) + { + UXController controller = targetObject.GetComponent(); + if (controller == null || controller.Controllers.Count == 0) return string.Empty; + + StringBuilder sb = new StringBuilder(); + foreach (var ctl in controller.Controllers) + { + string varibleName = ctl.Name.Substring(0, 1).ToUpper() + ctl.Name.Substring(1); + sb.AppendLine($"\t\tpublic UXController.ControllerDefinition {varibleName} {{ get; private set; }}"); + } + + sb.AppendLine("\t\tpublic override void Awake()"); + sb.AppendLine("\t\t{"); + sb.AppendLine("\t\t\tbase.Awake();"); + sb.AppendLine("\t\t\tvar ctl = gameObject.GetComponent();"); + + foreach (var ctl in controller.Controllers) + { + string varibleName = ctl.Name.Substring(0, 1).ToUpper() + ctl.Name.Substring(1); + sb.AppendLine($"\t\t\t{varibleName} = ctl.GetControllerByName(\"{ctl.Name}\");"); + } + + sb.AppendLine("\t\t}"); + return sb.ToString(); + } + } +} diff --git a/Editor/UX/Controller/UXControllerUIScriptFileWriter.cs.meta b/Editor/UX/Controller/UXControllerUIScriptFileWriter.cs.meta new file mode 100644 index 0000000..9dfbb60 --- /dev/null +++ b/Editor/UX/Controller/UXControllerUIScriptFileWriter.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ab989ac78a8546a4af89da0f0fe1b8f1 +timeCreated: 1774247192 \ No newline at end of file diff --git a/Runtime/UXComponent/Controller/UXBinding.cs b/Runtime/UXComponent/Controller/UXBinding.cs index cb71de4..82221cd 100644 --- a/Runtime/UXComponent/Controller/UXBinding.cs +++ b/Runtime/UXComponent/Controller/UXBinding.cs @@ -2,7 +2,7 @@ using System; using System.Collections.Generic; using UnityEngine; -namespace AlicizaX.UI +namespace UnityEngine.UI { public enum UXBindingFallbackMode { diff --git a/Runtime/UXComponent/Controller/UXBindingPropertyUtility.cs b/Runtime/UXComponent/Controller/UXBindingPropertyUtility.cs index 2a981fe..a8958dc 100644 --- a/Runtime/UXComponent/Controller/UXBindingPropertyUtility.cs +++ b/Runtime/UXComponent/Controller/UXBindingPropertyUtility.cs @@ -1,10 +1,8 @@ using System; using System.Collections.Generic; using TMPro; -using UnityEngine; -using UnityEngine.UI; -namespace AlicizaX.UI +namespace UnityEngine.UI { public sealed class UXBindingPropertyMetadata { diff --git a/Runtime/UXComponent/Controller/UXController.cs b/Runtime/UXComponent/Controller/UXController.cs index e5ab88c..414e05e 100644 --- a/Runtime/UXComponent/Controller/UXController.cs +++ b/Runtime/UXComponent/Controller/UXController.cs @@ -5,7 +5,7 @@ using UnityEngine; using UnityEditor; #endif -namespace AlicizaX.UI +namespace UnityEngine.UI { [DisallowMultipleComponent] [AddComponentMenu("UX/UX Controller")] @@ -89,6 +89,7 @@ namespace AlicizaX.UI return _controllers; } } + public IReadOnlyList Bindings => _bindings; public int ControllerCount => _controllers.Count; @@ -128,6 +129,22 @@ namespace AlicizaX.UI return false; } + public ControllerDefinition GetControllerByName(string controllerName) + { + if (string.IsNullOrWhiteSpace(controllerName)) + { + return null; + } + + EnsureInitialized(); + if (_controllerNameMap.TryGetValue(controllerName, out int index)) + { + return _controllers[index]; + } + + return null; + } + public ControllerDefinition GetControllerAt(int index) { EnsureInitialized();