Unity Editor の Inspector には,列挙型enum
をドロップダウン形式で表示することが出来ます。
その要素となる列挙子の表示方法には,Unity 独自のルールが存在します。
本稿では,その仕様について御説明いたします。
(Unity 2018.3.0f2)
まずは,次の画像を御覧ください。
続いて,元になったスクリプトがこちら。
using UnityEngine; public class NewBehaviourScript : MonoBehaviour { enum List { _1, _if, _a, _, __,//半角アンダースコア2つ @if, a }; [SerializeField] List list = List.@if; void Update() { Debug.Log((int)list + ": " + list); } }
元になった列挙型enum
であるlist
の中身(列挙子)と,エディター上の表記に食い違いがありますね。
詳しく見て行きましょう。
頭に半角アンダースコア
列挙子の1文字目を半角アンダースコア(アンダーバー)_
にすると,Inspector 上では省略されます。
これによって,本来は識別子として1文字目に使用できない文字(数字等)で始まる項目や予約語を表示できます。
半角アンダースコア1つのみ
列挙子を半角アンダースコア_
1つにすると,Inspector 上では選択できない区切り線(水平罫線)になります。
1つの列挙型enum
内に,一度しか使用できません。
頭に半角アットマーク
列挙子の1文字目を半角アットマーク@
にしても,Inspector 上では省略されます。
また「頭に半角アンダースコア」と同じく予約語を表示できますが,本来は識別子として1文字目に使用できない文字(数字等)で始まる項目は設定できません。
文字列としては半角アットマーク@
が付いていない状態で認識されるため,前述の半角アンダーバー_
を付けた物とは区別されます。
ただし Inspector 上では半角アンダースコア_
や半角アットマーク@
が省略されているため,両方を1つの列挙型enum
に含めると2つ目は重複と見なされ表示されません。
例に挙げたプログラムでは初期値を設定する事によって2つ目を選択した状態で開始しますが,ドロップダウンメニューからいずれかを選択すると再選択できなくなります。
結局どうすればいいの?
列挙子に1つでも予約語を含む場合,すべての列挙子の頭に半角アットマーク@
を付けるべきだと考えます。
表記を統一した方が可読性も上がりますし,文字列の取得も自動的に半角アットマーク@
を除いて行われるためです。
数字と区切り線だけは半角アンダースコア_
を使用する必要がありますので,それらの場合は頭に半角アットマーク@
ではなく半角アンダースコア_
で統一しても良いでしょう。
そして頭の半角アンダースコア_
を除いた列挙子名を取得する際は,String.Substring()
メソッド等を利用します。
var startIndex = 1; Debug.Log((string.Empty + list).Substring(startIndex));
以上,Inspector に表示する列挙型の仕様に関する提案でした。