属性とは?

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

NonSerializedSerializeFieldとは逆に、通常表示される変数をインスペクタ上に表示したくない場合に使用します。

個人的にはpublic変数を使わないのでほぼ使ったことがないです。

NonSerializedUnityEngineが用意しているものではないのでusing System; が必要です。

以下の例だと、NonSerializedがある_value2はインスペクタ上に表示されません。

using System;
using UnityEngine;

public class InspectorTest : MonoBehaviour
{
    public int _value1;
    [NonSerialized] private int _value2;
}

HideInInspector

HideInInspectorpublic変数をインスペクタ上に表示しないようになります。

public変数を使いたいがインスペクタ上で変更されたくない、といった用途で使えます。

表示されないだけでシリアライズはされるため何らかの方法で書き換えると、

シーン上、プレハブ上は保持されるようになります。

using UnityEngine;

public class InspectorTest : MonoBehaviour
{
    public int _value1;
    [HideInInspector] public int _value2;
}

見出しをつけたい場合に使用します。

非エンジニアがインスペクタ上で作業する場合に助かるかもしれません。

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;
}

まとめ

インスペクタ上の見た目を拡張できる属性について説明しました。

これらはパッケージなどを追加しなくても最初から使用でき、

インスペクタの視認性や操作性を高めることが出来るので取り入れていくといいでしょう。

インスペクタを拡張する独自の属性を作ることも出来ますが、また機会があれば解説します。

🔗関連ページ