皆さん、こんにちは!SAT-BOXのツバメです。
以前、「Scriptable Object」でデバッグモードのON / OFFを切り替える
記事を書きましたが、その時に触れていた「Editor Window」について
今回は紹介しようと思います!
前回の記事はこちら!
sat-box.hatenablog.jp
1.実装する内容
今回は以下の画像のような画面を作成しようと思います!
・Int型を指定できるフィールド
・String型を指定できるフィールド
・Bool型のTrue/Falseをするトグル
の3つを作成します!では、やっていきましょう!
2.実装準備
まず最初に、3つの変数を保存しておく部分を作成しておきます。
using UnityEngine;
public class EditorWindowData : MonoBehaviour
{
/// <summary>
/// Int型の値を設定する変数
/// </summary>
public static int intValue = 0;
/// <summary>
/// String型の文字を設定する変数
/// </summary>
public static string stringValue = "";
/// <summary>
/// トグルのTrue/Falseを設定する変数
/// </summary>
public static bool boolValue= false;
}
Staticで宣言しているのは参照しやすいからで、特に意味は無いです。
では、こちらの変数を更新できるように[Editor Window]の処理を作成します!
3.Editor Windowの作成
こちらがコードになります。
using UnityEngine;
using UnityEditor;
public class EditorWindowData_Editor : EditorWindow
{
int intValue;
string stringValue;
bool isToggle;
[MenuItem("MyEditor/テスト")]
static void Open()
{
// この処理で作成した画面を開く
GetWindow<EditorWindowData_Editor>();
}
void OnGUI()
{
intValue = EditorWindowData.intField;
stringValue = EditorWindowData.stringValue ;
isToggle = EditorWindowData.boolValue;
GUILayout.Label("▼ テスト");
GUILayout.Label("Int型フィールド");
// [intValue]に変更があるかを確認する処理
EditorGUI.BeginChangeCheck();
{
// Int型フィールド作成
intValue = EditorGUILayout.IntField(intValue);
}
// Int型フィールドで数値に変更があった場合
if (EditorGUI.EndChangeCheck())
{
// 数値を更新
EditorWindowData.intField = intValue;
}
GUILayout.Label("String型フィールド");
// [stringValue]に変更があるかを確認する処理
EditorGUI.BeginChangeCheck();
{
// String型フィールド作成
stringValue = GUILayout.TextArea(stringValue);
}
// String型フィールドで数値に変更があった場合
if (EditorGUI.EndChangeCheck())
{
// 文字を更新
EditorWindowData.stringValue = stringValue;
}
GUILayout.Label("トグル");
// [isToggle]に変更があるかを確認する処理
EditorGUI.BeginChangeCheck();
{
// トグル作成
isToggle = GUILayout.Toggle(isToggle, "");
}
// トグルのON/OFFに変更があった場合
if (EditorGUI.EndChangeCheck())
{
// ON/OFF更新
EditorWindowData.boolValue= isToggle;
}
}
}
長く感じるかもしれませんが、内容は単純です。重要な箇所だけ順番に説明していきます!
using UnityEditor;
エディター拡張に必須のこちらの処理は書いておきましょう。これがないとエディター拡張がそもそも出来ないので…。
public class EditorWindowData_Editor : EditorWindow
デフォルトではMonoBehaviourになっている部分を[EditorWindow]に置き換えてしまいます。これも[Editor Window]にする場合は必須です。
[MenuItem("MyEditor/テスト")]
static void Open()
{
// この処理で作成した画面を開く
GetWindow<EditorWindowData_Editor>();
}
ここで実際のUnity上から画面を呼び出す処理を書いています。
この処理を書くと、メニューに画像のように表示されると思います!
この項目から呼び出すことが出来ます!この処理を書いておかないと、画面を作成しても呼び出せないので注意してください!今は「MyEditor/テスト」にしていますが、好きに変更しても問題ありません。
void OnGUI()
{
intValue = EditorWindowData.intField;
stringValue = EditorWindowData.stringValue ;
isToggle = EditorWindowData.boolValue;
GUILayout.Label("▼ テスト");
GUILayout.Label("Int型フィールド");
// [intValue]に変更があるかを確認する処理
EditorGUI.BeginChangeCheck();
{
// Int型フィールド作成
intValue = EditorGUILayout.IntField(intValue);
}
// Int型フィールドで数値に変更があった場合
if (EditorGUI.EndChangeCheck())
{
// 数値を更新
EditorWindowData.intField = intValue;
}
GUILayout.Label("String型フィールド");
// [stringValue]に変更があるかを確認する処理
EditorGUI.BeginChangeCheck();
{
// String型フィールド作成
stringValue = GUILayout.TextArea(stringValue);
}
// String型フィールドで数値に変更があった場合
if (EditorGUI.EndChangeCheck())
{
// 文字を更新
EditorWindowData.stringValue = stringValue;
}
GUILayout.Label("トグル");
// [isToggle]に変更があるかを確認する処理
EditorGUI.BeginChangeCheck();
{
// トグル作成
isToggle = GUILayout.Toggle(isToggle, "");
}
// トグルのON/OFFに変更があった場合
if (EditorGUI.EndChangeCheck())
{
// ON/OFF更新
EditorWindowData.boolValue= isToggle;
}
}
今回のメインとなる画面の表示を処理している場所です。
intValue = EditorGUILayout.IntField(intValue);
Int型の数値を変更できます。
stringValue = GUILayout.TextArea(stringValue);
String型の文字を変更できます。
isToggle = GUILayout.Toggle(isToggle, "");
Bool型のTrue/Falseを変更できます。第2引数が空白なのはLabelで項目名を表示するためです。普通に名前を入れると画像のようになります。
これで自由に画面の数値を変更できるようになりました。非常に簡単ですね。誰でも分かるような形にしておけば、チームでの開発もスムーズに進むのではないのでしょうか?
注意点としては、設定した数値などは自分のUnity上でのみ保存されるので他の人のUnityには影響が及ばないところですね。統一をしたいのであれば、「Scriptable Object」を使用した方がいいと思います。
また、時間があれば他のエディター拡張について紹介しようと思います。
以上、ツバメでした!