この記事はUnityの基本的な使い方を解説するシリーズの一つで、今回はインスペクターを拡張するための「属性」について一通りご説明します。
属性とは?
C#でいうところの属性(Attribute)とは、クラスや変数などに追加の情報を与えるものです。例えば下のように変数の前に[Range]という属性をつけると…
[Range(0, 10)] public int range = 0;
インスペクター上で変数が単なる数値ではなく、範囲制限付きのスライダーとして表示されます。
Unityではこのようにインスペクター上に変数を表示・非表示したり表示方法を変更したりするための属性がいくつか用意されています。
これらをうまく使いこなせるようになると、インスペクターから値を変更するときにとても便利になるのでぜひ覚えておきましょう。
インスペクター拡張用の主な属性
それではインスペクター上での表示を変更する属性を見ていきましょう。主な属性は次の表の通りです。
属性 | 機能 |
---|---|
SerializeField | 変数をシリアライズする |
NonSerialized | 変数をシリアライズしない |
Header | 見出しを表示 |
Tooltip | カーソルを合わせたときにヒントを表示 |
Range | スライダーを表示 |
Min | 最小値を設定 |
Multiline | 複数行入力可能なテキストボックスを表示 |
TextArea | スクロールバー付きのテキストボックスを表示 |
Space | フィールドの間を空ける |
HideInInspector | インスペクターでその変数を表示しない |
SerializeField
まずSerializeField属性をつけると、変数がシリアライズされてインスペクター上に表示されるようになります。
シリアライズとは簡単に言えば「インスペクターで設定した値を保存しておくこと」というようなニュアンスです。ただし何でもかんでもシリアライズしてインスペクター上で表示できるかというとそうでもなく、シリアライズできないものもあります(※例えばDictionaryなど)。
ちなみにpublic変数はこの属性をつけなくても勝手にシリアライズされます。
NonSerialized
次にSerializeFieldの逆バージョンとしてNonSerializedという属性もあります。これは変数をシリアライズせず、インスペクターにも表示しないための属性です。
なおこの属性を使うにはC#スクリプトの冒頭に「using System;」と書いておく必要があります。
Header
Headerは見出しを表示する属性です。インスペクターに項目がずらっと並んでいるだけだと見づらいのですが、これでまとまりごとに見出しを設定するとかなり見やすくなります。
[Header("テスト見出し1")]
Tooltip
Tooltipは、カーソルをインスペクターの項目名の上に合わせたときにツールチップを表示する属性です。補助的に説明を表示させたいときに使います。
[Tooltip("これはツールチップのテストです。")]
Range
Rangeは冒頭の例のように項目を範囲制限つきのスライダー表示させる属性です。float型とint型の変数に使うことができます。
注意点としては、これはあくまでもインスペクター上で操作する場合の範囲制限であり、C#スクリプト上で値を変更する際は制限が効かないのでご注意ください。
Min
Minはその項目の最小値を設定できる属性です。インスペクターで操作した場合、数値がその値よりも小さくなることを防ぎます。こちらもRangeと同様にfloat型とint型の変数に使うことができます。注意点も同様で、こちらもインスペクター上でのみ制限が効きます。
Multiline
Multilineは、string型の変数のテキスト入力フィールドを複数行表示にする属性です。後述するTextAreaとは違ってスクロールバーが出ないので使い勝手はあまりよくありません。
[Multiline] public string text1;
TextArea
TextAreaはMultilineと同様に複数行のテキスト入力フィールドを表示させる属性です。こちらは長い文字列を入力した際にスクロールバーが表示されるのでMultilineよりも使い勝手がよいと思います。使うならこちらをお勧めします。
[TextArea] public string text2;
Space
Spaceはインスペクターの項目同士の間隔を大きめにとるための属性です。同じような項目がずらずらと並んでいるだけだと見づらいので、適宜この属性を使うと見やすくなります。
HideInInspector
最後にHideInInspectorはその変数をインスペクターに表示しないようにする属性です。一見するとNonSerializedと似ていますが、こちらはシリアライズの有無に関係なくインスペクターに表示しない、という点が特徴です。
例えばpublic変数を使いつつ、インスペクターからは値をいじれないようにしたい場合などに便利だと思います。
おわりに
以上、インスペクター拡張用の属性についてご説明しました。
属性を使いこなせるようになるとインスペクターの表示がよりスマートになり、Unityでの作業が捗るようになります。ぜひ上記の内容を参考にしていただき、属性を使ってみて頂ければと思います。