Inspector window

Inspector window

Inspector window

フィールドをInspector windowへ表示する

C#Scriptのpublic フィールドはUnity EditorのInspector windowに表示されて、値を設定することができます。他のC#ScriptからアクセスするのでpublicでもInspector windowに表示したくない場合や、逆に他のC#ScriptからはアクセスさせたくないのでprivateにするけどInspector windowから設定したい場合には属性をつける等で表示・非表示が変更できます。

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestInspector : MonoBehaviour
{
    [Header("Inspectorに表示するのはpublic変数")]
    public bool publicMember = true; // 表示される
    protected bool protectedMember = true; // 表示されない
    private bool privateMember = true; // 表示されない

    [Header("publicでなくても[SerializeField]をつければ表示される")]
    [SerializeField]
    protected int protectedSerializedField = 123; // 表示される
    [SerializeField]
    private string privateSerializedField = "hello"; // 表示される

    // [System.NonSerialized]属性をつければpublic変数でも表示されない
    [NonSerialized] // using System; or [System.NonSerialized]
    public bool nonSerializedAttribute; // 表示されない

    // static変数はInspectorで表示されない
    public static bool staticMember; // 表示されない

    // プロパティはInspectorに表示されない
    public bool SerializedProperty { get; set; } // 表示されない

    // [HideInInspector]属性をつけると表示されない
    [HideInInspector]
    public bool hideInInspectorAttribute; // 表示されない

    [Header("[Tooltip]属性でツールチップが付けられる")]
    [Tooltip("ツールチップ")]
    public float tooltipAttribute; // ツールチップ

    [Header("[Range]属性でスライダーを表示する")]
    [Range(0, 1)]
    public float rangeAttribute; // スライダー

    [Header("[Multiline]属性で複数行にできる")]
    [Multiline(5)]
    public string multilineAttribute = "1\n2" + System.Environment.NewLine + "3"; // 5行

    [Header("[TextArea]属性でスクロールバーも使える")]
    [TextArea(3,5)]
    public string areaText = "1\n2\n3\n4\n5";
}
日本語を使う場合文字コードはUTF8へ

日本語でコードを書く場合はShift-JISではUnity Editor上で文字化けしてしまいます。ファイルの文字コードをUTF8にしましょう。

フィールド初期化子の値はGameObjectへアタッチしたときの初期値となります。以降はInspectorの値も保持されるので、フィールド初期化子の値を変更してもInspectorの値は変更されません。フィールド初期化子の値を生かしたい場合はRemove Component後にまたアタッチすればInspector windowに初期値として表示されます。

C#ScriptではprivateにしてもInspetorに表示していればその値がコンストラクタ後に設定されるためアクセス属性だけでなくInspectorに表示しているかどうかも意識する必要があります。

コンテキストメニューを追加する

Inspectorのコンテキストメニューを追加できます。メニューによりメソッドを呼ぶことができます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestContextMenu : MonoBehaviour
{
    [ContextMenu("メニュー名")]
    void Test()
    {
        Debug.Log("コンテキストメニュから呼ばれました。");
    }
}

Editorのカスタマイズ

Editorをカスタマイズすることもできます。詳しくはマニュアルを参照してください。ここではボタンによりメソッドを呼んでいます。

using UnityEngine;

[ExecuteInEditMode]
public class TestCustomEditor : MonoBehaviour
{
    public void Test()
    {
        Debug.Log("カスタムボタンから呼ばれました");
    }
}
using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(TestCustomEditor))]
[CanEditMultipleObjects]
public class MyCustomEditor : Editor
{
    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();
        TestCustomEditor test = target as TestCustomEditor;
        if (GUILayout.Button("カスタムボタン"))
        {
            test.Test();
        }
    }
}
Editor拡張はEditorフォルダーの下で

using UnityEditor;(UnityEngineでなく)を使っている等UnityEditor名前空間下のクラスを参照しているC#ScriptはEditorフォルダを作成しその下に置いてください。Unity Editorを使っている分には動いていてもBuild SettingsでPlatform向けのビルドを行うとエラーになります。Editorフォルダ下のC#ScriptはPlatform向けビルドの対象外になります。

カスタムエディター - Unity マニュアル
アプリケーションの開発をスピードアップするために、よく使うコンポーネントのカスタムエディターを作成しましょう。このページでは、ゲームオブジェクトが常に一点を見るようにする簡単なスクリプトの作成方法を紹介します。

コメント