Unityエディタ上でモデルを並べる場合、通常はPrefabをシーンビューにドラッグ&ドロップして並べますね。
ただ、数が多くなると手作業で並べるのは大変なので、スクリプトを使って並べられると便利です。そこで、この記事ではUnityエディタ拡張を使って、Unityエディタ上でPrefabを並べる方法を紹介します。
今回はメニューから「PlaceCubes」という項目を選択したら自動的にCubeのPrefabを並べるエディタ拡張スクリプトを作ってみます。
エディタ拡張を使ってモデルを並べる流れは次のとおりです。
CubeのPrefabを作る
いつもと同じように、ヒエラルキーウインドウに追加したCubeを
プロジェクトウィンドウにドラッグ&ドロップしてCubeのPrefabを作ります。
CubeのPrefabの名前は、ここでは「CubePrefab」とします。
ヒエラルキーウインドウのCubeは右クリック→Deleteで削除しておきましょう。
エディタ拡張スクリプトを作る
次に、エディタ拡張のスクリプトを作ります。エディタ拡張スクリプトは通常のC#と同じようにプロジェクトウィンドウで右クリック→Create→C# Scriptで作成します。
今回のファイル名はCubePlacementにしておきましょう。
ファイルが作成できたら次のスクリプトを入力して下さい。
using UnityEngine; using UnityEditor; public class StageEditorWindow : EditorWindow { [MenuItem("Window/PlaceCubes")] static void Place() { GameObject cubePrefab = AssetDatabase.LoadAssetAtPath<GameObject>("Assets/Cube.prefab"); for (int i = 0; i <= 180; i+=5) { GameObject g = PrefabUtility.InstantiatePrefab(cubePrefab) as GameObject; float y = 10 * Mathf.Sin(i * Mathf.Deg2Rad); g.transform.position = new Vector3(i / 5.0f, y, 0); } } }
Unityエディタ拡張では、MenuItemアトリビュートを使うことで、指定した場所にメニュー項目を追加できます。ここでは[MenuItem("Window/PlaceCubes")]とすることで、メニューバー→WindowのなかにPlaceCubesという項目を追加しています。
このPlaceCubes項目を選択したときに実行されるのがPlaceメソッドです。Placeメソッドの中ではPrefabを読み出し、それをInstantiateしています。
Placeメソッドはstaticメソッドなので、インスペクタ経由でのPrefab設定ができません。そこで、AssetDatabase.LoadAssetAtPathメソッドを使って、Assetsフォルダ直下にあるCubePrefabをロードしています。LoadAssetAtPathメソッドでロードするには、オブジェクトの拡張子まで指定する必要があるので注意して下さい。
Resourcesフォルダからロードしたい場合は次のように記述しても問題ありません。(今回はAssetsフォルダ直下からロードするためにLoadAssetAtPathメソッドを使用しました)
Resources.Load("CubePrefab")
CubePrefabのインスタンスが作成できたら、アーチ状になるようにSinメソッドを使ってCubeの位置を移動しています。
エディタ拡張はゲームオブジェクトにアタッチする必要はないので、これで完成です!
メニューを選択する
それではCubePlacementメニューを選択して、動作するかを確認してみましょう。
参考
エディタ拡張に関しては、次のサイトが非常に参考になりました。
http://49.233.81.186/part1-menuitem.html49.233.81.186