いくつか手はあるでしょうが、一例としてEditorWindow を派生してカスタムウィンドウを作るのはどうでしょうか。
下記のようなスクリプトを作っておくと...
C#
1 using UnityEditor ;
2 using UnityEngine ;
3
4 public class ObjectGeneratorWindow : EditorWindow
5 {
6 private GameObject obj ;
7 private float range = 5.0f ;
8 private int count ;
9
10 // メニューの「Window」→「Object Generator」でウィンドウを開く
11 [ MenuItem ( "Window/Object Generator" ) ]
12 private static void OpenWindow ( )
13 {
14 GetWindow < ObjectGeneratorWindow > ( "Object Generator" ) . Show ( ) ;
15 }
16
17 private void OnGUI ( )
18 {
19 // パラメーター設定用フィールドを表示する
20 // 「各種コントロール表示用メソッドに現在の値を渡す」→「返ってきた値を新しい値として使う」というパターンがよく使われる
21 this . obj = EditorGUILayout . ObjectField ( "GameObject" , this . obj , typeof ( GameObject ) , true ) as GameObject ;
22 this . range = Mathf . Max ( EditorGUILayout . FloatField ( "Range" , this . range ) , 0.0f ) ;
23 this . count = Mathf . Max ( EditorGUILayout . IntField ( "Count" , this . count ) , 1 ) ;
24
25 // objがセットされていなければGenerateボタンを無効化する
26 using ( new EditorGUI . DisabledScope ( this . obj == null ) )
27 {
28 // Buttonメソッドによりボタンを表示する
29 // 返り値がtrueなら、ボタンがクリックされたことを意味する
30 if ( GUILayout . Button ( "Generate" ) )
31 {
32 Generate ( this . obj , this . range , this . count ) ;
33 }
34 }
35 }
36
37 private static void Generate ( GameObject obj , float range , int count )
38 {
39 for ( var i = 0 ; i < count ; i ++ )
40 {
41 var newObject = Instantiate ( obj , new Vector3 ( Random . Range ( - range , range ) , 0 , Random . Range ( - range , range ) ) , Quaternion . identity ) ;
42
43 // 取り消しできるよう登録しておくと便利かもしれない
44 Undo . RegisterCreatedObjectUndo ( newObject , $ "Generate {obj.name}" ) ;
45 }
46 }
47 }
メニュー項目が追加され、下図のような見た目のウィンドウを出せるようになるでしょう。
ウィンドウ上でパラメーターを設定してボタンを押すとGenerate
が実行され、シーン上に新しいオブジェクトが現れるかと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。