Unity:Editor拡張について
初めに
Editor 拡張についての説明とその仕方についてまとめます。
Index
Editor 拡張
Unity Editor とは
Unity Editor とは、Unity における開発環境本体のことです。Unity 本体のアプリケーションが Unity Editor であり、これを実行して、デバッグやビルドを行います。開発画面で見える Game ビューや Scene ビュー、Inspector ウィンドウなどで構成されています。
Editor 拡張とは
Editor 拡張とは、既存で用意されている Editor 機能以外の機能をスクリプトを書いて追加することです。
いろいろな機能を追加できるため、用途はさまざまですが、基本的な目的は開発効率を上げることになります。
Editor 拡張の仕方
次の手順で Editor 拡張をしていきます。
//こちらは Editor フォルダ内に入れる必要あり using UnityEditor;
//Editor フォルダ内に入れなくてもよい #if UNITY_EDITOR using UnityEditor; #endif
- スクリプトに追加したい機能を記述する
注意点
スクリプトを Editor フォルダ内に入れるか、#if UNITY_EDITOR/#endif で挟まなければ、ビルド時にエラーがでます。ビルドするまでエラーがでないので、気をつけましょう。
Editor 拡張してみた
今回の拡張内容の概要
今回は、次の3つの作業をしてみます。
- ウィンドウの生成
- ウィンドウに表示させるものや機能の追加をする
ウィンドウの生成
下のスクリプトを Editor フォルダに作ります。
using UnityEngine; #if UNITY_EDITOR using UnityEditor; //追加 #endif public class MyWindow : EditorWindow //MonoBehaviour から変更 { // Assets で右クリックすると MyWindow のメニューが追加されます。 [MenuItem("Assets/My Window")] static void Init() { // ウィンドウの生成 MyWindow window = (MyWindow)EditorWindow.GetWindow(typeof(MyWindow)); window.Show(); }
特筆すべき点は下記の3点です。
- UnityEnitor の追加する
- エディター拡張で、GUI を作るときは MonoBehaviour ではなく EditorWindow を継承する
- MenuItem 属性でメニューを追加する
追加された My Window をクリックすると、ウィンドウが生成されました。
EditorWindow
エディターウィンドウを作成するには、EditorWindow を継承します。このあと使う EditorWindow.OnGUI 関数でエディターの GUI(Graphical User Interface:マウスやキーボードなど視覚的に操作可能な画面) を実装します。
EditorWindow で扱える変数や関数はドキュメントをご覧ください。EditorWindow.OnGUI 関数についての説明やスクリプトのサンプルも載っています。
docs.unity3d.com
MenuItem
MenuItem はUnity のメニューアイテムに新しいものを追加する属性です。追加されたものをクリックすると、属性がつけられた静的な(static)関数を実行します。Assets や Window など既にあるメニュー内に追加したり、新しくメニューを作ったりすることもできます。
//Assets 内に MyWindow を追加 [MenuItem("Assets/My Window")] //Window 内に Sample を追加 [MenuItem("Window/Sample")] //自作の MyMenu というメニュー内に Test を追加 [MenuItem("MyMenu/Test")]
ウィンドウに表示させるものや機能の追加をする
EditorWindow.OnGUI 関数内に、ウィンドウに表示させるものや機能を追加していきます。その際、GUILayouy や EditorGUILayout を用います。
using UnityEngine; #if UNITY_EDITOR using UnityEditor; #endif public class MyWindow : EditorWindow { string myString = ""; bool groupEnabled; bool myBool = false; float myFloat = 0.0f; string text = ""; // Add menu named "My Window" to the Window menu [MenuItem("Assets/My Window")] static void Init() { // Get existing open window or if none, make a new one: MyWindow window = (MyWindow)EditorWindow.GetWindow(typeof(MyWindow)); window.Show(); } void OnGUI() { //ラベル GUILayout.Label("ラベル", EditorStyles.boldLabel); //テキストフィールド myString = EditorGUILayout.TextField("Text Field", myString); //ToggleGroup groupEnabled = EditorGUILayout.BeginToggleGroup("Optional Settings", groupEnabled); //Toggle myBool = EditorGUILayout.Toggle("Toggle", myBool); //Silder myFloat = EditorGUILayout.Slider("Slider", myFloat, -3, 3); //ToggleGroup終了 EditorGUILayout.EndToggleGroup(); //カラーを表示 EditorGUILayout.ColorField("カラー", Color.white); //ポップアップを表示 EditorGUILayout.IntPopup("ポップアップ", 1, new string[] { "小", "中", "大", }, new int[] { 0, 1, 2 }); //XYZ座標を表示 EditorGUILayout.Vector3IntField("XYZ座標", Vector3Int.one); //テキストフィールドを表示 EditorGUILayout.TextField("テキストフィールド", ""); //ヘルプボックスを表示 EditorGUILayout.HelpBox("ヘルプボックス", MessageType.Info); //テキストエリア text = EditorGUILayout.TextArea(text, GUILayout.Height(100)); //ボタン, おされたらtrueを返し、コンソールにtextを表示 if(GUILayout.Button("コンソールに出力!!")); { Debug.Log(text); } } }
GUILayout, EditorGUILayout について
どちらも GUI の表示に使うクラスです。これらの違いは EditorGUILayout は Editor で使うための拡張であり、GUILayout は Editor に限らずしようできるようです。使用できる関数は下のドキュメントをご覧ください。
docs.unity3d.com
docs.unity3d.com
似たようなものに GUI, EditorGUI もあります。それぞれの違いについては、わかりやすくまとめてくださっている記事のリンクを貼っておきます。
hacchi-man.hatenablog.com
最後に
Editor 拡張について簡単にまとめました。わたしは Editor 拡張についてきちんと認識しておらず、ビルド時にエラーが出てしまうことがあります。気をつけたい。