ひとりでのアプリ開発 - fineの備忘録 -

ひとりでアプリ開発をするなかで起こったことや学んだことを書き溜めていきます

Unity:Editor拡張について

初めに

 Editor 拡張についての説明とその仕方についてまとめます。

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 はUnity のメニューアイテムに新しいものを追加する属性です。追加されたものをクリックすると、属性がつけられた静的な(static)関数を実行します。Assets や Window など既にあるメニュー内に追加したり、新しくメニューを作ったりすることもできます。

//Assets 内に MyWindow を追加
[MenuItem("Assets/My Window")]
//Window 内に Sample を追加
[MenuItem("Window/Sample")]
//自作の MyMenu というメニュー内に Test を追加
[MenuItem("MyMenu/Test")]

docs.unity3d.com

ウィンドウに表示させるものや機能の追加をする

 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 拡張についてきちんと認識しておらず、ビルド時にエラーが出てしまうことがあります。気をつけたい。