【Unity】【エディタ拡張】実行ボタン付きのウィンドウをScriptableWizardで簡単に実装する

実行ボタンがついたシンプルなウィンドウをScriptableWizardを使って実装する方法です。

簡単なウィンドウを作ってみる

まずは基本的な機能で簡単なウィンドウを作ります。

#if UNITY_EDITOR
using UnityEngine;
using UnityEditor;

public class ScriptableWizardExample : ScriptableWizard { // ScriptableWizardを継承する

    [SerializeField]
    private float _testField  = 1.0f;

    [MenuItem("Window/Scriptable Wizard Example")]
    private static void Open()
    {
        DisplayWizard<ScriptableWizardExample>(ObjectNames.NicifyVariableName(typeof(ScriptableWizardExample).Name));
    }

    /// <summary>
    /// Createボタンが押された時の処理
    /// </summary>
    private void OnWizardCreate () 
    {
        Debug.Log("Create was pressed.");
    }
}
#endif

Windowメニューから次のようなウィンドウを開けます。

f:id:halya_11:20180920121012p:plain

いろんな機能

ScriptableWizardの他の機能として、もう一つボタンを追加したり、
バリデーションしたり、GUIをカスタムできたりします。

#if UNITY_EDITOR
using UnityEngine;
using UnityEditor;

public class ScriptableWizardExample : ScriptableWizard {

    [SerializeField]
    private float _testField  = 1.0f;

    [MenuItem("Window/Scriptable Wizard Example")]
    private static void Open()
    {
        // 引数に二つの文字列を入力するとボタンが二つ表示される
        DisplayWizard<ScriptableWizardExample>(ObjectNames.NicifyVariableName(typeof(ScriptableWizardExample).Name), "Create", "Other");
    }

    private void Awake()
    {
        // 説明があればhelpStringに入れる
        helpString = "このウィンドウの説明";
    }

    /// <summary>
    /// 値が変更されるたびに呼ばれる
    /// </summary>
    private void OnWizardUpdate()
    {
        // 値のバリデーション結果はisValidに入れる
        // 不正だった場合はCreateボタンが非アクティブになる
        isValid = _testField >= 0;
        // 不正だった場合のエラーメッセージはerrorStringに入れる
        errorString = isValid ? null : "Error Description";
    }

    /// <summary>
    /// Createボタンが押された時の処理
    /// </summary>
    private void OnWizardCreate () 
    {
        // Createボタンを押したときの処理
        Debug.Log("Create was pressed.");
    }

    /// <summary>
    /// Otherボタンが押された時の処理
    /// </summary>
    private void OnWizardOtherButton()
    {
        Debug.Log("Other was pressed.");
    }

    /// <summary>
    /// GUI描画
    /// </summary>
    protected override bool DrawWizardGUI ()
    {
        var so  = new SerializedObject(this);
        so.Update();

        using (var ccs = new EditorGUI.ChangeCheckScope()) {
            EditorGUILayout.PropertyField(so.FindProperty("_testField"));
            if (ccs.changed) {
                so.ApplyModifiedProperties();
                // 変更があった場合はtrueを返す
                return true;
            }
        }
        // 変更が無い場合はfalseを返す
        return false;
    }
}
#endif

ウィンドウはこんな感じになります。

f:id:halya_11:20180920121130p:plain