概要
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が表示されます。
試しに、Cubeをシーンに配置して、5個複製してみます。
オフセットは、X方向に1.5とします。
複製ボタンを押すと、以下のようになります!
指定したオフセット分ズレながら、複製されていますね!