概要
ある要素の子としてvisualTreeAssetを追加したい時がある
ネット上に転がっている情報では
visualTreeAsset.CloneTree(root)
と
var el = visualTreeAsset.Instantiate()
root.Add(el)
という書き方が混在している
どちらが正しいか迷ったので備忘録
結論?
Instantiate
が正しい
CloneTreeはUIElements時代の名残であり、現在は非推奨となっている
実装上もInstantiate()の処理と同等なので、完全に置き換えてしまって大丈夫
// CloneTree()の中身は完全にInstantiate()
public TemplateContainer CloneTree() => this.Instantiate();
This function will be deprecated. Use VisualTreeAsset.Instantiate instead.
この関数は非推奨になります。代わりに VisualTreeAsset.Instantiate を使用してください。
-
VisualTreeAsset.CloneTree
https://docs.unity3d.com/ScriptReference/UIElements.VisualTreeAsset.CloneTree.html -
VisualTreeAsset.Instantiate
https://docs.unity3d.com/ScriptReference/UIElements.VisualTreeAsset.Instantiate.html
ちょっと待って。ここからがマグマなんです。
非推奨になるのは CloneTree()
と CloneTree(string bindingPath)
だけで、CloneTree(VisualElement target)
は残る。
そもそもCloneTree()
+CloneTree(string bindingPath)
と CloneTree(VisualElement target)
は挙動が違う
Instantiate()
CloneTree()
CloneTree(string bindingPath)
このメソッドたちは、元となったVisualElementが TemplateContainer要素
の子となりターゲットの下につく
CloneTree(VisualElement target)
は、TemplateContainerが作られず直接要素が追加される
自分はこれに1敗したのでみんな注意してください