using AlicizaX.UI; using AlicizaX.UI.Runtime; using UnityEditor; using UnityEditor.SceneManagement; using UnityEngine; using UnityEngine.UIElements; namespace Aliciza.UXTool { public class UXControllerAddWindow : EditorWindow { private UXController _ux; private TextField _nameField; private IntegerField _lengthField; public static void ShowWindow(UXController ux) { var w = CreateInstance(); w.titleContent = new GUIContent("添加控制器"); w._ux = ux; w.position = new Rect(Screen.width / 2f - 150f, Screen.height / 2f - 60f, 320, 120); w.ShowUtility(); } private void OnEnable() { var root = rootVisualElement; root.style.paddingLeft = 8; root.style.paddingTop = 8; root.style.paddingRight = 8; root.style.paddingBottom = 8; var title = new Label("添加控制器"); title.style.unityFontStyleAndWeight = FontStyle.Bold; title.style.marginBottom = 6; root.Add(title); _nameField = new TextField("Name"); _nameField.value = _ux != null ? $"Controller{_ux.Controllers.Count}" : "Controller"; root.Add(_nameField); _lengthField = new IntegerField("Length"); _lengthField.value = 2; root.Add(_lengthField); var row = new VisualElement(); row.style.flexDirection = FlexDirection.Row; row.style.justifyContent = Justify.FlexEnd; row.style.marginTop = 8; var add = new Button(() => { if (_ux != null) { Undo.RecordObject(_ux, "Add Controller"); // 使用 SerializedObject 能保证序列化 var so = new SerializedObject(_ux); var controllersProp = so.FindProperty("_controllers"); int newIndex = controllersProp.arraySize; controllersProp.InsertArrayElementAtIndex(newIndex); var el = controllersProp.GetArrayElementAtIndex(newIndex); var nameProp = el.FindPropertyRelative("Name"); var lengthProp = el.FindPropertyRelative("Length"); nameProp.stringValue = _nameField.value; lengthProp.intValue = Mathf.Max(1, _lengthField.value); so.ApplyModifiedProperties(); EditorUtility.SetDirty(_ux); } else { // 如果外部没有提供 UXController,尝试在 prefab root 上添加 var prefabStage = PrefabStageUtility.GetCurrentPrefabStage(); if (prefabStage != null && prefabStage.prefabContentsRoot != null) { var comp = Undo.AddComponent(prefabStage.prefabContentsRoot); EditorUtility.SetDirty(prefabStage.prefabContentsRoot); if (comp != null) { Undo.RecordObject(comp, "Add Controller"); var so = new SerializedObject(comp); var controllersProp = so.FindProperty("_controllers"); controllersProp.InsertArrayElementAtIndex(0); var el = controllersProp.GetArrayElementAtIndex(0); var nameProp = el.FindPropertyRelative("Name"); var lengthProp = el.FindPropertyRelative("Length"); nameProp.stringValue = _nameField.value; lengthProp.intValue = Mathf.Max(1, _lengthField.value); so.ApplyModifiedProperties(); EditorUtility.SetDirty(comp); } } } Close(); }); add.text = "添加"; row.Add(add); var cancel = new Button(() => Close()); cancel.text = "取消"; cancel.style.marginLeft = 8; row.Add(cancel); root.Add(row); } } }