【Unity】【UI Toolkit】UXMLファイルから他のUXMLやUSSを指定する4つの方法とその違い

UnityのUI ToolkitでUXMLファイルから他のUXMLやUSSを指定する4つの方法とその違いについてまとめました。

Unity 2022.2.17

はじめに

UXMLファイルから他のUXMLファイルを指定することで、UXMLファイルをテンプレートとして使い回すことができます。

light11.hatenadiary.com

また、Style要素を使うことでそのUXMLファイルに適用するUSSを指定することができます。

本記事では、このようにUXMLファイルからUXMLやUSSを指定する際の指定方法についてまとめます。

UXMLの位置からの相対パスで指定する

srcアトリビュートを使うと、UXMLの位置からの相対パスを使って指定することができます。

<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements" xsi="http://www.w3.org/2001/XMLSchema-instance" engine="UnityEngine.UIElements" editor="UnityEditor.UIElements" noNamespaceSchemaLocation="../../UIElementsSchema/UIElements.xsd" editor-extension-mode="False">
    <ui:Template src="../Templates/example_template.uxml" name="Example"/>
    <ui:Instance template="Example" />
</ui:UXML>

このsrcアトリビュートを使う方法では、参照先のファイルがなかったらインポート時にエラーになるため、エラーに気づきやすいというメリットがあります。

アセットパスで指定する

srcアトリビュートにはアセットパスを指定することもできます。

<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements" xsi="http://www.w3.org/2001/XMLSchema-instance" engine="UnityEngine.UIElements" editor="UnityEditor.UIElements" noNamespaceSchemaLocation="../../UIElementsSchema/UIElements.xsd" editor-extension-mode="False">
    <ui:Template src="/Assets/Example/Editor/Templates/example_template.uxml" name="Example"/>
    <ui:Instance template="Example" />
</ui:UXML>

明確にアセットパスであることを区別するためにproject:プレフィックスをつけることもできます。

<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements" xsi="http://www.w3.org/2001/XMLSchema-instance" engine="UnityEngine.UIElements" editor="UnityEditor.UIElements" noNamespaceSchemaLocation="../../UIElementsSchema/UIElements.xsd" editor-extension-mode="False">
    <ui:Template src="project:/Assets/Example/Editor/Templates/example_template.uxml" name="Example"/>
    <ui:Instance template="Example" />
</ui:UXML>

Resourcesフォルダを使う

pathアトリビュートを使うと、テンプレート用のUXMLファイルやUSSファイルをResourcesフォルダに格納しておき、それを読み込むことができます。
この場合には通常のResourcesフォルダからの読み込みと同様、Resourcesフォルダからの相対パスを拡張子なしで指定します。

<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements" xsi="http://www.w3.org/2001/XMLSchema-instance" engine="UnityEngine.UIElements" editor="UnityEditor.UIElements" noNamespaceSchemaLocation="../../UIElementsSchema/UIElements.xsd" editor-extension-mode="False">
    <ui:Template path="example_template" name="Example"/>
    <ui:Instance template="Example" />
</ui:UXML>

この場合にはsrcアトリビュートとは異なり、パスが間違えていてもインポート時にはエラーが出ないので注意が必要です。

Editor Default Resourcesフォルダを使う

Resourcesフォルダの代わりにEditor Default Resourcesフォルダを使うこともできます。
この場合にはEditor Default Resourcesの仕様に合わせて、フォルダからの相対パスを拡張子ありで指定する必要があります。

<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements" xsi="http://www.w3.org/2001/XMLSchema-instance" engine="UnityEngine.UIElements" editor="UnityEditor.UIElements" noNamespaceSchemaLocation="../../UIElementsSchema/UIElements.xsd" editor-extension-mode="False">
    <ui:Template path="example_template.uxml" name="Example"/>
    <ui:Instance template="Example" />
</ui:UXML>

参考

docs.unity3d.com