2025-12-01 16:46:28 +08:00
|
|
|
|
using AlicizaX.UI;
|
|
|
|
|
|
using AlicizaX.UI.Runtime;
|
|
|
|
|
|
using UnityEditor;
|
|
|
|
|
|
using UnityEditor.SceneManagement;
|
|
|
|
|
|
using UnityEngine;
|
|
|
|
|
|
using UnityEngine.UIElements;
|
|
|
|
|
|
|
2025-12-09 20:31:44 +08:00
|
|
|
|
namespace AlicizaX.UXTool
|
2025-12-01 16:46:28 +08:00
|
|
|
|
{
|
|
|
|
|
|
public class UXControllerAddWindow : EditorWindow
|
|
|
|
|
|
{
|
|
|
|
|
|
private UXController _ux;
|
|
|
|
|
|
private TextField _nameField;
|
|
|
|
|
|
private IntegerField _lengthField;
|
|
|
|
|
|
|
|
|
|
|
|
public static void ShowWindow(UXController ux)
|
|
|
|
|
|
{
|
|
|
|
|
|
var w = CreateInstance<UXControllerAddWindow>();
|
|
|
|
|
|
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<UXController>(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);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|