using System; using System.Collections.Generic; using UnityEditor; using UnityEngine; namespace TEngine.Editor.UI { public enum UIFieldCodeStyle { /// /// Field names start with underscore (e.g., _variable) /// [InspectorName("Field names start with underscore (e.g., _variable)")] UnderscorePrefix, /// /// Field names start with m_ prefix (e.g., m_variable) /// [InspectorName("Field names start with m_ prefix (e.g., m_variable)")] MPrefix, } [Serializable] public class ScriptGenerateRuler { public string uiElementRegex; public string componentName; public bool isUIWidget = false; public ScriptGenerateRuler(string uiElementRegex, string componentName, bool isUIWidget = false) { this.uiElementRegex = uiElementRegex; this.componentName = componentName; this.isUIWidget = isUIWidget; } } [CustomPropertyDrawer(typeof(ScriptGenerateRuler))] public class ScriptGenerateRulerDrawer : PropertyDrawer { public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { EditorGUI.BeginProperty(position, label, property); position = EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), label); var indent = EditorGUI.indentLevel; EditorGUI.indentLevel = 0; var uiElementRegexRect = new Rect(position.x, position.y, 120, position.height); var componentNameRect = new Rect(position.x + 125, position.y, 150, position.height); var isUIWidgetRect = new Rect(position.x + 325, position.y, 150, position.height); EditorGUI.PropertyField(uiElementRegexRect, property.FindPropertyRelative("uiElementRegex"), GUIContent.none); EditorGUI.PropertyField(componentNameRect, property.FindPropertyRelative("componentName"), GUIContent.none); EditorGUI.PropertyField(isUIWidgetRect, property.FindPropertyRelative("isUIWidget"), GUIContent.none); EditorGUI.indentLevel = indent; EditorGUI.EndProperty(); } } [CreateAssetMenu(menuName = "TEngine/ScriptGeneratorSetting", fileName = "ScriptGeneratorSetting")] public class ScriptGeneratorSetting : ScriptableObject { private static ScriptGeneratorSetting _instance; public static ScriptGeneratorSetting Instance { get { if (_instance == null) { string[] guids = AssetDatabase.FindAssets("t:ScriptGeneratorSetting"); if (guids.Length >= 1) { string path = AssetDatabase.GUIDToAssetPath(guids[0]); _instance = AssetDatabase.LoadAssetAtPath(path); } } return _instance; } } // [FolderPath] // [LabelText("默认组件代码保存路径")] [SerializeField] private string _codePath; // [LabelText("绑定代码命名空间")] [SerializeField] private string _namespace = "GameLogic"; // [LabelText("子组件名称(不会往下继续遍历)")] [SerializeField] private string _widgetName = "item"; public string CodePath => _codePath; public string Namespace => _namespace; public string WidgetName => _widgetName; public UIFieldCodeStyle CodeStyle = UIFieldCodeStyle.UnderscorePrefix; [SerializeField] private List scriptGenerateRule = new List() { new ScriptGenerateRuler("m_go", "GameObject"), new ScriptGenerateRuler("m_item", "GameObject"), new ScriptGenerateRuler("m_tf", "Transform"), new ScriptGenerateRuler("m_rect", "RectTransform"), new ScriptGenerateRuler("m_text", "Text"), new ScriptGenerateRuler("m_richText", "RichTextItem"), new ScriptGenerateRuler("m_btn", "Button"), new ScriptGenerateRuler("m_img", "Image"), new ScriptGenerateRuler("m_rimg", "RawImage"), new ScriptGenerateRuler("m_scrollBar", "Scrollbar"), new ScriptGenerateRuler("m_scroll", "ScrollRect"), new ScriptGenerateRuler("m_input", "InputField"), new ScriptGenerateRuler("m_grid", "GridLayoutGroup"), new ScriptGenerateRuler("m_hlay", "HorizontalLayoutGroup"), new ScriptGenerateRuler("m_vlay", "VerticalLayoutGroup"), new ScriptGenerateRuler("m_slider", "Slider"), new ScriptGenerateRuler("m_group", "ToggleGroup"), new ScriptGenerateRuler("m_curve", "AnimationCurve"), new ScriptGenerateRuler("m_canvasGroup", "CanvasGroup"), new ScriptGenerateRuler("m_tmp","TextMeshProUGUI"), }; public List ScriptGenerateRule => scriptGenerateRule; [MenuItem("TEngine/Create ScriptGeneratorSetting")] private static void CreateAutoBindGlobalSetting() { string[] paths = AssetDatabase.FindAssets("t:ScriptGeneratorSetting"); if (paths.Length >= 1) { string path = AssetDatabase.GUIDToAssetPath(paths[0]); EditorUtility.DisplayDialog("警告", $"已存在ScriptGeneratorSetting,路径:{path}", "确认"); return; } ScriptGeneratorSetting setting = CreateInstance(); AssetDatabase.CreateAsset(setting, "Assets/Editor/ScriptGeneratorSetting.asset"); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); } public static List GetScriptGenerateRule() { if (Instance == null) { return null; } return Instance.ScriptGenerateRule; } public static string GetUINameSpace() { if (Instance == null) { return string.Empty; } return Instance.Namespace; } public static UIFieldCodeStyle GetCodeStyle() { if (Instance == null) { return UIFieldCodeStyle.UnderscorePrefix; } return Instance.CodeStyle; } public static string GetCodePath() { if (Instance == null) { return string.Empty; } return Instance.CodePath; } public static string GetWidgetName() { if (Instance == null) { return string.Empty; } return Instance.WidgetName; } } }