暴露自訂control給UXML
- 自訂control需要繼承
VisualElement
並且這個自訂control需要有一個預設constructor
1
2
3
4
5
6
7
8
9
10
11class StatusBar : VisualElement
{
// 需要有一個預設constructor
public StatusBar()
{
m_Status = String.Empty;
}
string m_Status;
public string status { get; set; }
} - 為了讓你自訂的control可以在UXML中使用,你需要定義一個factory class,如果沒有特殊的需求,可以直接繼承
UxmlFactory<T>
1
2
3
4
5
6
7class StatusBar : VisualElement
{
// 建議直接將factory class放在自訂的control中
public new class UxmlFactory : UxmlFactory<StatusBar> {}
// ...
} - UxmlTraits:定義在UXML中可以使用的特徵(UXML traits),
- UxmlTraits的目的有
- factory建立新物件時使用它們。
- 在schema產生時,會分析它們以取得關於該Element的資訊,之後將這些資訊轉換為XML schema directive。
- 以下範例
- 宣告了一個m_Status,用來定義一個XML attribute
status
uxmlChildElementsDescription
回傳一個空IEnumerable,用來表明這個自訂的StatusBar沒有child。Init()
中,XML parser從property bag讀出的值設定給StatusBar.status
UxmlTraits
class定義在StatusBar class中,讓Init()
可以存取StatusBar
的私有變數。- UxmlTraits繼承了
VisualElement.UxmlTraits
,它也擁有VisualElement.UxmlTraits
的屬性 Init()
會呼叫base.Init()
以初始化base class的屬性
- 宣告了一個m_Status,用來定義一個XML attribute
- UxmlTraits的目的有
1 | class StatusBar : VisualElement |
- 注意:在UI Builder中創作時,UI Builder可能會多次呼叫`UxmlTraits.Init()`來同步UXML檔案中的值,建議使用`GetValueFromBag`而不是`TryGetValueFromBag`以確保當UI Builder取消設定(unset)element的值時,這個element不會殘留先前的值。
- 若想要有child的話,需要override
uxmlChildElementsDescription
,1
2
3
4
5
6
7public override IEnumerable<UxmlChildElementDescription> uxmlChildElementsDescription
{
get
{
yield return new UxmlChildElementDescription(typeof(VisualElement));
}
} - 可以將你自訂的control放到namespace中來分類它們
1
2[ ]
[ ]
Reference:https://docs.unity3d.com/Manual/UIE-expose-custom-control-to-uxml.html#define-a-factory