Version: 2022.3
言語: 日本語
IMGUI でエディターを拡張する
Property Drawer

エディターウィンドウ

Note: Unity エディター を拡張するには、UI Toolkit を使用することを強く推奨します。UI Toolkit は、IMGUI よりも最新の機能で、柔軟性があり、スケーラブルなソリューションを提供するからです。

アプリケーション内でカスタムウィンドウをいくつでも作ることができます。カスタムウィンドウもインスペクター、シーン、その他のビルトインウィンドウと同じように機能します。カスタムウィンドウは、ゲームのサブシステムにユーザーインターフェースを追加するのにぴったりの方法です。

カットシーン・アクションのスクリプティングに使用される、Serious Games Interactive による Custom Editor Interface
カットシーン・アクションのスクリプティングに使用される、Serious Games Interactive による Custom Editor Interface

カスタムウィンドウの作成は、以下の手順で簡単に行えます。

  • EditorWindow を継承するスクリプトを作成します。
  • コードを使用してウィンドウを呼び出し表示します。
  • ツールのための GUI コードを実装します。

EditorWindow の継承

Editor Window を作成するには、スクリプトが “Editor” という名前のフォルダー内にある必要があります。このスクリプト中で、EditorWindow を継承するクラスを作成してください。その後、OnGUI 関数内で GUI 制御を書いてください。

using UnityEngine;
using UnityEditor;
using System.Collections;

public class Example : EditorWindow

    {
        void OnGUI () {
            // 実際のウィンドウのコードはここに書きます
           }
    }

MyWindow.cs - placed in a folder called ‘Editor’ within your project.

ウィンドウの表示

ウィンドウを画面上に表示するには、それを表示するメニュー項目を作成します。これを行うには、MenuItem プロパティによって呼び出される関数を作成します。

The default behavior in Unity is to recycle windows, so selecting the menu item again would show existing windows. This is done by using the function EditorWindow.GetWindow Like this:

using UnityEngine;
using UnityEditor;
using System.Collections;

class MyWindow : EditorWindow {
    [MenuItem ("Window/My Window")]

    public static void  ShowWindow () {
        EditorWindow.GetWindow(typeof(MyWindow));
    }
    
    void OnGUI () {
        //  実際のウィンドウのコードはここに書きます
    }
}

MyWindow の表示

これにより、ドック可能な標準のエディターウィンドウがひとつ作成されます。このウィンドウの位置は次の起動時まで保存され、またカスタムレイアウト中で使用することができます。作成する内容をより具体的に設定したい場合は、GetWindowWithRect を使用できます。

ウィンドウの GUI の実装

ウィンドウのコンテンツは、OnGUI 関数を実装することによってレンダリングされます。インゲーム GUI ( GUIGUILayout ) に使用するものと同じ UnityGUI クラスを使用できます。Unity はこの他にもいくつかの GUI 制御を提供しています。これらはエディターでのみ動作する EditorGUIEditorGUILayout クラスに入っています。これらのクラスは、すでに通常のクラスで使用可能な制御に対して追加されたものなので、自由に組み合わせることができます。

以下の C# コードでは、GUI 要素をカスタムの EditorWindow に追加しています。

using UnityEditor;
using UnityEngine;

public class MyWindow : EditorWindow
{
    string myString = "Hello World";
    bool groupEnabled;
    bool myBool = true;
    float myFloat = 1.23f;
    
    // Window メニューに "My Window" というメニュー項目を追加
    [MenuItem("Window/My Window")]
    public static void ShowWindow()
    {
        //既存のウィンドウのインスタンスを表示。ない場合は作成します。
        EditorWindow.GetWindow(typeof(MyWindow));
    }
    
    void OnGUI()
    {
        GUILayout.Label ("Base Settings", EditorStyles.boldLabel);
        myString = EditorGUILayout.TextField ("Text Field", myString);
        
        groupEnabled = EditorGUILayout.BeginToggleGroup ("Optional Settings", groupEnabled);
            myBool = EditorGUILayout.Toggle ("Toggle", myBool);
            myFloat = EditorGUILayout.Slider ("Slider", myFloat, -3, 3);
        EditorGUILayout.EndToggleGroup ();
    }
}

この結果、以下のようなウィンドウができ上がります。

上記の参考例によって作成されたカスタムのエディターウィンドウ。
上記の参考例によって作成されたカスタムのエディターウィンドウ。

詳しくは、EditorWindow (エディターウィンドウ)に関するページを参照してください。

IMGUI でエディターを拡張する
Property Drawer