MRが楽しい

MRやVRについて学習したことを書き残す

UnityでInspcetorから参照を接続した状態でプレハブをシーンに追加する

本日は Unity の小ネタ枠です。
UnityでInspcetorから参照を接続した状態でプレハブをシーンに追加する方法について記事にします。

InstantiatePrefab

参照を接続した状態でプレハブをシーンに追加するには PrefabUtility.InstantiatePrefab 関数を利用します。
docs.unity3d.com

本関数は Object.Instantiate と異なり、プレハブの参照を接続したまま、オブジェクトをシーンに追加することができます。
docs.unity3d.com

動作確認

以下の自身のオブジェクト配下にプレハブの生成を行うサンプルコンポーネントとエディター拡張クラスを作成しました。
・ChildPrefabMaker.cs

using UnityEngine;

public class ChildPrefabMaker : MonoBehaviour
{
    [SerializeField, Tooltip("作成するプレハブ")]
    private GameObject _samplePrefab;

    public void CreateChildPrefabs()
    {
        // オブジェクト直下にプレハブの参照を保ったまま5個の子オブジェクトを作成する
        for (int i = 0; i < 5; i++)
        {
            var childObject = UnityEditor.PrefabUtility.InstantiatePrefab(_samplePrefab, transform) as GameObject;
            if (childObject is not null)
            {
                // 生成したオブジェクトを並べる
                childObject.name = $"ChildObject{i}";
                childObject.transform.position = new Vector3(0, 0, i);
            }
        }
    }
}

・ChildPrefabMaker.cs

using UnityEngine;
using UnityEditor;
using CUSTOMTYPE = ChildPrefabMaker;

// 拡張するクラスを指定する
[CustomEditor(typeof(CUSTOMTYPE))]
public class ChildPrefabMakerEditor : Editor
{
    // GUIの表示関数をオーバーライドする
    public override void OnInspectorGUI()
    {
        // 元のインスペクター部分を表示
        base.OnInspectorGUI();

        // targetを変換して対象スクリプトの参照を取得する
        CUSTOMTYPE targetScript = target as CUSTOMTYPE;

        // public関数を実行するボタンの作成
        if (GUILayout.Button("CreateChildPrefabsの実行"))
        {
            targetScript.CreateChildPrefabs();
        }
    }
}

サンプルコンポーネントを適当なオブジェクトに設定し、生成するプレハブの参照を追加します。

Inspector ビューに表示されるボタン押下して、オブジェクトの生成処理を実行してみます。
以下の通り、プレハブの参照を保ったまま子オブジェクトが5つ生成されました。

この状態で参照元のプレハブのカラーを変更してみます。
参照を保ったままのため、生成した全てのオブジェクトにプレハブの変更が反映されるようになっています。