主にプログラミング関連のメモ帳 ♪(✿╹ヮ╹)ノ
書いてあるコードは自己責任でご自由にどうぞ。記事本文の無断転載は禁止です。
2023/09/24
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 にて公開中です。