質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

488閲覧

オブジェクトをエディター段階で静的に生成

Yukirr4_

総合スコア728

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/03/22 15:09

編集2020/03/22 15:10

C#

1GameObject obj; 2public void Generate(int count) 3{ 4 for(int i = 0; i <= count; i++) 5 { 6 Instantiate(obj, new Vector3(Random.Range(-5f, 5f), 0, Random.Range(-5f, 5f), Quaternion.identity) 7 } 8}

objをランダムな位置に生成するコードです。

このメソッドはエディター実行中に処理されるものですが、これをエディターで作っている間に実行し、保存したいです。

どうすればいいのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

いくつか手はあるでしょうが、一例としてEditorWindowを派生してカスタムウィンドウを作るのはどうでしょうか。
下記のようなスクリプトを作っておくと...

C#

1using UnityEditor; 2using UnityEngine; 3 4public 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が実行され、シーン上に新しいオブジェクトが現れるかと思います。

投稿2020/03/22 18:53

Bongo

総合スコア10807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問