【Unity】オブジェクトを複製するエディタ拡張を作ろう!

概要

Unityで、ゲーム内オブジェクトに付与するスクリプトでは、MonoBehaviourを継承するのが普通です。
本記事では、EditorWindowを継承して、簡単なエディタ拡張を作成してみます。

さっそくコーディング

作成したコードは以下のようになります。
EditorWindowクラスを継承し、OnGUI()の中に、Windowとして表示したい内容を書いていますね。

using UnityEditor;
using UnityEngine;

public class ObjectDuplicator : EditorWindow
{
    private GameObject originalObject;
    private int numberOfCopies = 1;
    private Vector3 offset = Vector3.zero;

    //Toolsから呼び出す
    [MenuItem("Tools/ObjectDuplicator")]
    public static void ShowWindow()
    {
        GetWindow<ObjectDuplicator>("ObjectDuplicatorWindow");
    }

    //Windowに表示する内容
    private void OnGUI()
    {
        GUILayout.Label("Let's Duplicate!", EditorStyles.boldLabel);

        //コピー元オブジェクト、コピー数、オフセットをフィールドで受け取る
        originalObject = EditorGUILayout.ObjectField("Original Object", originalObject, typeof(GameObject), true) as GameObject;
        numberOfCopies = EditorGUILayout.IntField("Number of copies", numberOfCopies);
        offset = EditorGUILayout.Vector3Field("offset", offset);

        //ボタンを押したら複製
        if (GUILayout.Button("Duplicate!"))
        {
            DuplicateObjects();
        }
    }

    private void DuplicateObjects()
    {
        //複製対象がnullなら
        if (originalObject == null)
        {
            EditorUtility.DisplayDialog("ObjectDuplicator", "Original Objectが未設定です!", "OK");
            return;
        }
        
        //コピー数が0以下なら
        if (numberOfCopies <= 0)
        {
            EditorUtility.DisplayDialog("ObjectDuplicator", "コピー数が0以下です!", "OK");
            return;
        }

        //複製
        for (int i = 0; i < numberOfCopies; i++)
        {
            GameObject newObject = Instantiate(originalObject);
            newObject.transform.position = originalObject.transform.position + offset * (i+1);
            newObject.name = originalObject.name + "_Copy" + (i + 1);

            //Undoで取り消せるように登録
            Undo.RegisterCreatedObjectUndo(newObject, "Duplicate Object");
        }

        Debug.Log("Duplicated!");
    }
}

使ってみる

実際に使ってみましょう。
上で示したスクリプトは、「Editor」という名前のフォルダ内に配置する必要があるので、気を付けてください。
Toolsタブから呼び出すと、Windowが表示されます。

Toolsタブから呼び出し
Windowが表示される
試しに、Cubeをシーンに配置して、5個複製してみます。
オフセットは、X方向に1.5とします。
Windowにパラメータを設定
複製ボタンを押すと、以下のようになります!
実行後画面
指定したオフセット分ズレながら、複製されていますね!