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 にて公開中です。