自訂control
建立自訂的Control需要建立一個control C# class,然後將它暴露給UXML
建立一個繼承VisualElement的Class
若是要建立可綁定(Binding)的自訂Control,可以繼承自BaseField基底類別,而非
BindableElement
。繼承BaseField
有以下好處- 有實作一個泛型的
INotifyValueChanged
- 預設focusable
- 提供一個水平佈局(horizontal layout),左側為label element,右側為input element
- 有實作一個泛型的
VisualElement
不會綁定到GameObject的生命週期函數,也就是說它不會收到以下callbacks- Awake()
- OnEnable()
- OnDisable()
- OnDestroy()
可以在自訂control中的constructor做初始化的動作,但是如果你想要將初始化的動作延遲到這個自訂的control被加到UI之後,可以把初始化的動作加到AttachToPanelEvent callback
使用DetachFromPanelEvent callback可以偵測你自訂的control是否已經從UI上移除
1
2
3
4
5
6
7
8public CustomControl()
{
var myCustomElement = rootVisualElement.Q(className: "my-custom-element");
myCustomElement.RegisterCallback<AttachToPanelEvent>(e =>
{ /* 此處放置當這個elemenet被加入到UI上要做的事 */ });
myCustomElement.RegisterCallback<DetachFromPanelEvent>(e =>
{ /* 此處放置當這個elemenet從UI上移除後要做的事 */ });
}UI Toolkit
會分派這兩個事件(AttachToPanelEvent與DetachFromPanelEvent)給所有element要讓
UXML
與UI Builder
使用你自訂的control
,需要定義一個繼承UxmlFactory<T>
的factory class
將你自訂的control
暴露給他們。綁定資料需要實作
INotifyValueChanged
並根據需要監聽ChangeEvent
。繼承BindableElement
或是實作IBindable
。你可以創建
USS custom properties
以設定自訂控制項的樣式。
Reference: https://docs.unity3d.com/Manual/UIE-create-custom-controls.html