本日は 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 スクリプトを設定します。
動作確認
[UseSetColor]のチェックが外れているとき、[ObjectColor]のフィールド変数は表示されません。
[UseSetColor]のチェックを入れると、[ObjectColor]のフィールドが表示されます。
試しに[ObjectColor]に青色を設定してシーンを再生すると、起動時にオブジェクトの色が設定色に変化します。
値の保持
[ObjectColor]は HideInInspector で非表示にしているため、値を保持し続けます。
その後、マテリアルを元に戻して一旦[UseSetColor]のチェックを外して[ObjectColor]を非表示にしました。
再び[UseSetColor]のチェックを入れて[ObjectColor]を表示すると、前回設定した青色が保持され続けていることが確認できます。