なつねこメモ

主にプログラミング関連のメモ帳 ♪(✿╹ヮ╹)ノ 書いてあるコードは自己責任でご自由にどうぞ。記事本文の無断転載は禁止です。

Unity で動的に UXML を生成・読み込みしたい

Unity で UXML を動的に生成したいことってありますよね?わたしはあります。
例えば、 UXML で記述できる HTML もどきは仕様が古すぎて、 HTML Living Standard っぽく記述した物をトランスパイルするとか......。

ということで、その方法のメモ。
とはいっても、昔 USS で Media Query を再現したときと手法は同じです。

var t = typeof(UxmlNamespacePrefixAttribute).Assembly.GetType("UnityEditor.UIElements.UXMLImporterImpl");
var i = Activator.CreateInstance(t, true);
var m = t.GetMethod("ImportXmlFromString", BindingFlags.NonPublic | BindingFlags.Instance);
var args = new object[] { str, null };

m?.Invoke(i, args);

var asset = args[1] as VisualTreeAsset;

if (asset != null)
{
   asset.hideFlags = HideFlags.NotEditable;
   asset.name = $"UStyled-TransformedMarkups-{CalcHashString(str)}.uxml";
}

// asset が動的生成された UXML に値する

ポイントは、 Importer にある Import メソッドでは無く、 ImportXmlFromString を使うところ。
内部的には Import を呼んでいますが、それに加えていろいろ動作が追加されているので、こっちを使った方がより良いです。

ということで、メモでした。
ちなみにこれを使ったエディター拡張は GitHub にて公開中です。

github.com