属性とは?
Unity
ではなく、C#
の機能として属性(Attribute)
というものがあります。
属性とはクラス、メンバー(フィールドやメソッドなど)に追加の情報を与えるためのものです。
例えば、以下の様なコードに含まれる[SerializeField]
の部分です。
private void Player : MonoBehaviour
{
[SerializeField] private int _hp;
}
通常、private
変数はシリアライズされずインスペクタ上にも表示されません。
[SerializeField]
が指定されている場合は、インスペクタ上に表示され、編集した結果もシリアライズされるため、
シーンやプレハブ中で保持されるようになります。
インスペクタ上で使える属性
クラスやメソッドで使用する属性もありますが、
今回は変数に使用し、インスペクタ上で効果が得られるものについて説明したいと思います。
SerializeField
おなじみのSerializeField
です。
前述の通り、public
でない変数をインスペクタ上に表示出来るようになります。
using UnityEngine;
public class InspectorTest : MonoBehaviour
{
[SerializeField] private int _value;
}
NonSerialized
NonSerialized
はSerializeField
とは逆に、通常表示される変数をインスペクタ上に表示したくない場合に使用します。
個人的にはpublic
変数を使わないのでほぼ使ったことがないです。
NonSerialized
はUnityEngine
が用意しているものではないのでusing System;
が必要です。
以下の例だと、NonSerialized
がある_value2はインスペクタ上に表示されません。
using System;
using UnityEngine;
public class InspectorTest : MonoBehaviour
{
public int _value1;
[NonSerialized] private int _value2;
}
HideInInspector
HideInInspector
はpublic
変数をインスペクタ上に表示しないようになります。
public
変数を使いたいがインスペクタ上で変更されたくない、といった用途で使えます。
表示されないだけでシリアライズはされるため何らかの方法で書き換えると、
シーン上、プレハブ上は保持されるようになります。
using UnityEngine;
public class InspectorTest : MonoBehaviour
{
public int _value1;
[HideInInspector] public int _value2;
}
Header
見出しをつけたい場合に使用します。
非エンジニアがインスペクタ上で作業する場合に助かるかもしれません。
using UnityEngine;
public class InspectorTest : MonoBehaviour
{
[SerializeField, Header("プレイヤーのLv")] private int _lv;
[SerializeField, Header("プレイヤーのHp")] private int _hp;
}
Tooltip
変数名にマウスカーソルがある時に説明文を表示できます。
using UnityEngine;
public class InspectorTest : MonoBehaviour
{
[SerializeField, Tooltip("プレイヤーの名前")] private string _playerName;
}
Range
int
型、float
型に上限値と下限値を指定し、スライダーで編集できるようになります。
Range
の引数が整数の場合はint
型として、
浮動小数の場合はfloat
型として機能します。
using UnityEngine;
public class InspectorTest : MonoBehaviour
{
[SerializeField, Range(1, 10)] private int _lv;
[SerializeField, Range(0f, 1f)] private float _position;
}
Min
入力できる値の最小値を設定できるようになります。
using UnityEngine;
public class InspectorTest : MonoBehaviour
{
[SerializeField, Min(1)] private int _lv = 10;
}
Multiline
string
型フィールドは通常インスペクタ上で1行で表示されますが、
Multiline
で指定した行数分表示できるようになります。
using UnityEngine;
public class InspectorTest : MonoBehaviour
{
[SerializeField, Multiline(3)] private string _descriptioin;
}
TextArea
TextArea
でもstring
型フィールドの表示を変更することが出来ます。
Multiline
と違い左側にも広がるのでより編集しやすくなります。
またスクロールバーも表示されます。
TextArea
の引数で最小表示行数と最大表示行数も指定できます。
using UnityEngine;
public class InspectorTest : MonoBehaviour
{
[SerializeField, TextArea] private string _description1;
[SerializeField, TextArea(3, 10)] private string _description2;
}
Space
Space
を指定するとインスペクタ上でのフィールド間にスペースを挿入することが出来ます。
引数で高さを指定すれば必要以上に間を空けることも出来ます。
using UnityEngine;
public class InspectorTest : MonoBehaviour
{
[SerializeField] private int _value1;
[SerializeField] private int _value2;
[Space]
[SerializeField] private int _value3;
[Space(32)]
[SerializeField] private int _value4;
}
まとめ
インスペクタ上の見た目を拡張できる属性について説明しました。
これらはパッケージなどを追加しなくても最初から使用でき、
インスペクタの視認性や操作性を高めることが出来るので取り入れていくといいでしょう。
インスペクタを拡張する独自の属性を作ることも出来ますが、また機会があれば解説します。