MRが楽しい

MRやVRについて学習したことを書き残す

Unityで特定の条件でのみInspectorにフィールド変数を表示する

本日は Unity の小ネタ枠です。
Unityで特定の条件でのみInspectorにフィールド変数を表示する方法を記事にします。

public変数をフィールドに表示しない

特定条件でのみフィールド変数を表示させるため、public 変数をデフォルトでは表示させないようにします。
これには[HideInInspector]を用いる方法と、[System.NonSerialized]を用いる方法があります。
・HideInInspector
docs.unity3d.com
・System.NonSerialized
docs.microsoft.com

HideInInspector はそのまま非表示にしているだけなので何らかの形で一度値を入力すると情報を保持し続けます。
一方で System.NonSerialized はシリアライズされないため、値を保持し続けません。
pafu-of-duck.hatenablog.com

今回は再表示時に、前回設定した値を表示してほしいので HideInInspector を利用します。

特定条件でフィールド変数を表示する

特定条件でフィールド変数を表示するには Editor 拡張を利用します。
EditorGUILayout の ~Field 関数を利用してフィールド変数を表示することができます。
docs.unity3d.com

サンプルスクリプト

以下のサンプルスクリプトを作成しました。
[UseSetColor]が True のときのみ、[ObjectColor]のフィールド変数が表示されてオブジェクトの初期カラーを設定できます。
・FieldTest.cs

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

public class FieldTest : MonoBehaviour
{
    [SerializeField]
    private bool p_UseSetColor = false;
    public bool UseSetColor => p_UseSetColor;

    /// <summary>
    /// [System.NonSerialized]ではなく[HideInInspector]を設定することで
    /// フィールド非表示時も値を保持し続けるようになる
    /// </summary>
    [HideInInspector]
    public Color ObjectColor = Color.white;

    void Start()
    {
        if (p_UseSetColor)
        {
            this.GetComponent<Renderer>().sharedMaterial.SetColor("_Color", ObjectColor);
        }
    }
}

・FieldTestEditor.cs(Editor拡張)

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

[CustomEditor(typeof(FieldTest))]
public class FieldTestEditor : Editor
{
    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();

        FieldTest instance = target as FieldTest;

        // UseSetColor が True のときのみ、[ObjectColor]のフィールド変数を表示する
        if (instance.UseSetColor)
        {
            instance.ObjectColor = EditorGUILayout.ColorField("ObjectColor", instance.ObjectColor);
        }
    }
}

マテリアルを持つオブジェクトに FieldTest スクリプトを設定します。
f:id:bluebirdofoz:20220415234247j:plain

動作確認

[UseSetColor]のチェックが外れているとき、[ObjectColor]のフィールド変数は表示されません。
f:id:bluebirdofoz:20220415234256j:plain

[UseSetColor]のチェックを入れると、[ObjectColor]のフィールドが表示されます。
f:id:bluebirdofoz:20220415234305j:plain

試しに[ObjectColor]に青色を設定してシーンを再生すると、起動時にオブジェクトの色が設定色に変化します。
f:id:bluebirdofoz:20220415234313j:plain

値の保持

[ObjectColor]は HideInInspector で非表示にしているため、値を保持し続けます。
その後、マテリアルを元に戻して一旦[UseSetColor]のチェックを外して[ObjectColor]を非表示にしました。
f:id:bluebirdofoz:20220415234321j:plain

再び[UseSetColor]のチェックを入れて[ObjectColor]を表示すると、前回設定した青色が保持され続けていることが確認できます。
f:id:bluebirdofoz:20220415234331j:plain