なつねこメモ

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

UdonSharp コンポーネントをエディターから動的生成したい

Prefab からのセットアップ自動化みたいな想定で、 UdonBehaviour (U#) の中身をいじりたい。
そんなときのいじりかた。

といっても、基本は Unity で Component 変更するのと変わらない。

private static void AttachUSharpComponent(GameObject gameObject)
{
    var behaviour = gameObject.AddComponent<UdonBehaviour>();

    var so = new SerializedObject(behaviour);
    var us = ...; // アタッチしたい UdonSharp スクリプトの UdonSharpProgramAsset を何らかの方法で引っ張ってくる
    if (us.SerializedProgramAsset == null)
        us.CompileCsProgram();

    so.FindProperty("programSource").objectReferenceValue = us;
    so.FindProperty("serializedProgramAsset").objectReferenceValue = us.SerializedProgramAsset;
    so.ApplyModifiedPropertiesWithoutUndo();

    var component = behaviour.GetUdonSharpComponent<USharpComponent>();
    component.SetValue(...);
    component.ApplyProxyModifications();
}

UdonSharp Component は GetUdonSharpComponent で取れるので、そこから取得し、値を設定する。
設定した後は、 ApplyProxyModifications を呼べば適用される。
ということでメモでした。