今回はScriptableWizardを使ってメニューアイテムからエディターウィザードを開きゲームオブジェクトに設定されているスクリプトのパラメータを操作してみたいと思います。
エディターウィザードとはなんぞや?
と言う人も多いと思いますがパソコンへのソフトインストール時に表示される『次へ』、『OK』、『キャンセル』ボタンが表示されているようなウインドウの事みたいです。
それのUnityエディター版ですね。
Unityではアニメーションイベントを設定する時のウインドウがそうなのかもしれません(ボタンは表示されていませんが)。
今回はメニューアイテムにウィザードを表示するメニューを追加していきます。
エディターウィザード
エディターウィザードの作成
ウィザードを作成するにはScriptableWizardクラスを拡張して新しいクラスを作成する必要があります。
ウィザードクラスをScriptableWizardTestという名前にした場合は
1 2 3 4 5 6 7 8 9 | using UnityEngine; using System.Collections; using UnityEditor; public class ScriptableWizardTest : ScriptableWizard { } |
↑のようにScriptableWizardクラスを継承してクラスを作成します。
UnityEditorのクラスであるScriptableWizardを継承してクラスを作成しているのでEditorという名前のフォルダを作成しその中にファイルを移動させます。
ウィザードの表示
ウィザードはUnityのエディターのメニュー項目から表示させるので、Attributeを使いメニュー項目を追加します。
1 2 3 4 5 6 7 | [MenuItem("MyMenu/MyWizard")] static void CreateWizard() { // ウィザードを表示 ScriptableWizard.DisplayWizard<ScriptableWizardTest> ("ウィザード名", "Createボタンの名前", "それ以外のボタンの名前"); } |
アトリビュートでMenuItemとメニューとアイテム名を設定し、実行するメソッドをstatic(静的)で作成します。
MyWizardというメニューアイテムを選択したらCreateWizardメソッドが実行され、ScriptableWizard.DisplayWizardでこのクラスのウィザードを開きます。
第1引数がウィザードの名前で、第2引数がCreateボタンの名前、第3引数がそれ以外のボタンの名前となっています。
Createボタンはウィザードの右下、それ以外のボタンはCreateボタンの左に表示されます。
Createボタンを押した時に実行する処理
Createボタンを押した時はOnWizardCreateメソッドが呼ばれるのでその中に処理を記述します。
1 2 3 4 5 6 | // ウィザードの作成ボタンを押した時に実行 void OnWizardCreate() { // 実行したい処理 } |
Createボタンを押すとウィザードが消えます。
それ以外のボタンを押した時に実行する処理
それ以外のボタンを押した時はOnWizardOtherButtonメソッドが呼ばれるのでその中に処理を記述します。
1 2 3 4 5 6 | // ウィザードの他のボタンを押した時に実行 void OnWizardOtherButton() { // 実行したい処理 } |
それ以外のボタンを押した時はウィザードはそのまま表示されています。
ウィザードで変更があった時に実行する処理
ウィザードで変更があった時はOnWizardUpdateメソッドが呼ばれるのでその中に処理を記述します。
1 2 3 4 5 6 | // ウィザードで更新があった時に実行 void OnWizardUpdate () { // 実行したい処理 } |
ウィザードを使ったサンプルの作成
ウィザードの表示の仕方等がわかったので実際にウィザードのサンプルを作成してみます。
Main Cameraに新しくScriptableWizardDataスクリプトを設定します。
1 2 3 4 5 6 7 8 9 10 11 12 | using UnityEngine; using System.Collections; public class ScriptableWizardData : MonoBehaviour { public int intValue; public float floatValue; public Color color; } |
このScriptableWizardDataスクリプトのインスペクタの値をウィザードで操作出来るようにします。
ScriptableWizardDataスクリプトはUnityEditorのクラスを使っていないので通常のフォルダ内に置いておきます。
新しくScriptableWizardTestスクリプトを作成しScriptableWizardクラスを拡張してScriptableWizardTestクラスを作成します。
ScriptableWizardTestスクリプトはUnityEditorのクラスを使うのでEditorフォルダ内に移動させます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | using UnityEngine; using System.Collections; using UnityEditor; public class ScriptableWizardTest : ScriptableWizard { [SerializeField] private int intValue; // int型の値 [SerializeField] private float floatValue; // float型の値 [SerializeField] private Color color; // Color型の値 [SerializeField] private Transform[] transforms; // シーンに存在するTransform情報を入れるフィールド // 初期値 private int initIntValue; private float initFloatValue; private Color initColor; void Awake () { // 初期値を記憶しておく initIntValue = intValue; initFloatValue = floatValue; initColor = color; // シーンに存在するTransform情報を取得 transforms = GameObject.FindObjectsOfType (typeof(Transform)) as Transform[]; } [MenuItem("MyMenu/MyWizard")] static void CreateWizard() { // ウィザードを表示 ScriptableWizard.DisplayWizard<ScriptableWizardTest> ("自作ウィザード", "実行", "データの初期化"); } // ウィザードの作成ボタンを押した時に実行 void OnWizardCreate() { // ゲームオブジェクトを選択している if (Selection.activeTransform != null) { ScriptableWizardData data = Selection.activeTransform.GetComponent<ScriptableWizardData>(); if (data != null) { data.intValue = intValue; data.floatValue = floatValue; data.color = color; Debug.Log ("データを書き換えました"); } else { Debug.Log("ScriptableWizardDateが設定されていません。"); } } } // ウィザードの他のボタンを押した時に実行 void OnWizardOtherButton() { // データを初期化 intValue = initIntValue; floatValue = initFloatValue; color = initColor; Debug.Log ("データの初期化をしました"); } // ウィザードで更新があった時に実行 void OnWizardUpdate () { Debug.Log ("更新された"); Debug.Log(ScriptableWizard.focusedWindow); Debug.Log ("mouse:" + ScriptableWizard.mouseOverWindow); } } |
int、float、Color、Transform[]型のフィールドを定義します。
Awakeメソッドでそれぞれの初期値を記憶しておき、ヒエラルキー上にあるTransform情報を全て取得しフィールドに設定しています。
これによってウィザードのtransformsフィールドに取得したTransform情報が表示されます。
このTransform情報を取得したのは試しにしてみただけど特別使用するわけではありません・・・・(^_^;)
CreateWizardメソッドでScriptableWizard.DisplayWizardを使ってScriptableWizardTestのウィザードを作成します。
OnWizardCreateメソッドではヒエラルキー上で選択しているゲームオブジェクトがあればScriptableWizardDataスクリプトを取得しています。
取得出来た場合はウィザードの値でScriptableWizardDataの値を書き換えています。
OnWizardOtherButtonメソッドではウィザード内の書き換えたデータを初期値に戻しています。
OnWizardUpdateではウィザードの更新があった時にキーボードフォーカスがあるウインドウの表示とマウスカーソル下にあるウインドウを表示しています。
処理を見てわかるとおり実用的なスクリプトではありませんね・・・・(^_^;)
とりあえず出来上がったので確認してみましょう。
↑のようになりました。
『実行』ボタンを押すとウィザードで設定した値がScriptableWizardDataに反映されていますね。
終わりに
今回は実用的なサンプルは作れませんでしたが、

でTerrainに指定した数のゲームオブジェクトを地形に沿って設置するツールを作成してみました。
いやぁ実用的ですねぇ・・・(^_^)v