#nullable enable using UnityEngine; using UnityEngine.UIElements; namespace UVC.UIToolkit { /// /// 3D 벡터 속성 아이템 /// UTKVector3Field 사용 /// public class UTKVector3PropertyItem : UTKPropertyItemBase { #region Fields private UTKVector3Field? _vectorField; #endregion #region Properties public override UTKPropertyType PropertyType => UTKPropertyType.Vector3; #endregion #region Constructor public UTKVector3PropertyItem(string id, string name, Vector3 initialValue = default) : base(id, name, initialValue) { } #endregion #region Override Methods public override VisualElement CreateUI() { var container = CreateUIFromUxml("UTKVector3PropertyItem"); if (container == null) { return CreateUIFallback(); } _vectorField = container.Q("value-field"); if (_vectorField != null) { _vectorField.Value = Value; _vectorField.label = ""; } return container; } private VisualElement CreateUIFallback() { var container = CreateContainer(); var label = CreateNameLabel(); container.Add(label); var valueContainer = new VisualElement(); valueContainer.AddToClassList("utk-property-item__value"); _vectorField = new UTKVector3Field(); _vectorField.name = "value-field"; _vectorField.label = ""; _vectorField.Value = Value; _vectorField.AddToClassList("utk-property-item__vector3-field"); valueContainer.Add(_vectorField); container.Add(valueContainer); return container; } public override void BindUI(VisualElement element) { base.BindUI(element); _vectorField = element.Q("value-field"); if (_vectorField != null) { _vectorField.Value = Value; _vectorField.label = ""; _vectorField.IsEnabled = !IsReadOnly; _vectorField.OnValueChanged += OnVectorChanged; } } public override void UnbindUI(VisualElement element) { if (_vectorField != null) { _vectorField.OnValueChanged -= OnVectorChanged; _vectorField = null; } base.UnbindUI(element); } public override void RefreshUI() { if (_vectorField != null && _vectorField.Value != Value) { _vectorField.SetValueWithoutNotify(Value); } } protected override void UpdateReadOnlyState() { base.UpdateReadOnlyState(); if (_vectorField != null) { _vectorField.IsEnabled = !IsReadOnly; } } #endregion #region Private Methods private void OnVectorChanged(Vector3 newValue) { DebounceValueChange(newValue, 100).Forget(); } #endregion } }