自訂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