自訂control

建立自訂的Control需要建立一個control C# class,然後將它暴露給UXML

  1. 建立一個繼承VisualElement的Class

  2. 若是要建立可綁定(Binding)的自訂Control,可以繼承自BaseField基底類別,而非 BindableElement。繼承BaseField有以下好處

    • 有實作一個泛型的INotifyValueChanged
    • 預設focusable
    • 提供一個水平佈局(horizontal layout),左側為label element,右側為input element
  3. VisualElement不會綁定到GameObject的生命週期函數,也就是說它不會收到以下callbacks

    • Awake()
    • OnEnable()
    • OnDisable()
    • OnDestroy()
  4. 可以在自訂control中的constructor做初始化的動作,但是如果你想要將初始化的動作延遲到這個自訂的control被加到UI之後,可以把初始化的動作加到AttachToPanelEvent callback

  5. 使用DetachFromPanelEvent callback可以偵測你自訂的control是否已經從UI上移除

    1
    2
    3
    4
    5
    6
    7
    8
    public CustomControl()
    {
    var myCustomElement = rootVisualElement.Q(className: "my-custom-element");
    myCustomElement.RegisterCallback<AttachToPanelEvent>(e =>
    { /* 此處放置當這個elemenet被加入到UI上要做的事 */ });
    myCustomElement.RegisterCallback<DetachFromPanelEvent>(e =>
    { /* 此處放置當這個elemenet從UI上移除後要做的事 */ });
    }
  6. UI Toolkit會分派這兩個事件(AttachToPanelEvent與DetachFromPanelEvent)給所有element

  7. 要讓UXMLUI Builder使用你自訂的control,需要定義一個繼承UxmlFactory<T>factory class將你自訂的control暴露給他們。

  8. 綁定資料需要實作INotifyValueChanged並根據需要監聽ChangeEvent。繼承BindableElement或是實作IBindable

  9. 你可以創建USS custom properties以設定自訂控制項的樣式。

Reference: https://docs.unity3d.com/Manual/UIE-create-custom-controls.html

評論