Tsuの雑記¯\_(ツ)_/¯

主に製作メモ・備忘録として使用。製作したアプリのリンクもあります。

【Unity】Inspector に表示される列挙型の仕様 【C#】

Unity Editor の Inspector には,列挙型enumをドロップダウン形式で表示することが出来ます。

その要素となる列挙子の表示方法には,Unity 独自のルールが存在します。

本稿では,その仕様について御説明いたします。

(Unity 2018.3.0f2)

まずは,次の画像を御覧ください。

列挙型 enum をドロップダウンメニューとして Inspector に表示している画像
列挙型 enum を Inspector に表示

続いて,元になったスクリプトがこちら。

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()メソッド等を利用します。

docs.microsoft.com

var startIndex = 1;
Debug.Log((string.Empty + list).Substring(startIndex));

以上,Inspector に表示する列挙型の仕様に関する提案でした。