創作世界のいろいろ〜AdobeとかC#とか

絵を描く人がC#とか3Dとか動画編集とかやる為の備忘録

【Unity】列挙型enumを使ってメニュー画面を作る

列挙型のenumをunityで活用してみる。

何が利点なのか

テキストは通常、キャンバス-パネル-テキスト,,,というように、子や孫オブジェクトに入ることが多く、ヒエラルキー上で変更するときにぽちぽちするのが面倒です。

この方法なら、親オブジェクトのインスペクター上で操作可能です。しかもオブジェクトを何個増やしてもコードを追記する必要はありません。

文字列を変えたい場合は、コードを書き換えるだけです。

 

サンプル

例えば下の様なコピペして羅列しただけの画面が、

再生ボタンを押すと自動的に、下のようになります。

 

やり方

まず、新しくscript"StudyGenre.cs"を作成して、下の様なコードを書きます。

 

public class StudyGenre
{
    public enum Genre
    {
        WORD,
        SPEAK,
        KANJI,
        GRAMMAR,
        NUMBER,
        OTHER,
    }
}

enum型はC#の型なので、MonoBehaviourはいらないです。usingも特に必要ないので上記のコードが全文です。

まずこれはこれで保存してunityに戻ります。

 

文字列を変えたいpanelがHierarchy上に複数あるとします。

下の様な感じで、選択中のものが全て同じ構成のパネルになっています。

同じ構成になっていることが重要です。

便宜上、Word,Speak,Kanji,,,と名前を変えていますが、これは全てpanelです。子要素に"ContentLabel"という名前のテキストが配置されています。

 

このPanelのほうに、新しいscript"StudyMenuController.cs"を新規作成します。

下記の様なコードを書きます。

 

    //StudyGenreが、enumを定義したスクリプトStudyGenre.csです。
    //ここでは必ずSerializeFieldしてください。
    [SerializeField]
    StudyGenre.Genre genre;

    void Start()
    {
        Settitle();
    }

    //TitleをStudyGenre.Genreのenumからセットする
    void Settitle()
    {
        //Panelにある子オブジェクトのTextを、
        //配置されてる順番で取得する。(transform〜は定形文として覚える)
        GameObject child = transform.GetChild(1).gameObject;

        //取得したGameObjectのtextmesh~componentを取得
        TextMeshProUGUI title = child.GetComponent<TextMeshProUGUI>();

        //textの値をinspector上で設定したenumの値に変換
        title.text = genre.ToString();
    }

このコード内の、

transform.GetChild(1).gameObject;

この部分です。

panelの子オブジェクトになっている2番目に配置されてるテキストコンポーネントがあるオブジェクトを取得しています。

これですね。

 

panel(例えば上記画面のWord)を選択してみます。

アタッチされたStudyMenuControllerに、enumと同じ文字列が選択できるようになっているはずです。

これを各パネルで選択しておくだけで、起動すると下記の様にテキストが変換されます。

 

親パネルを開いて、テキストのあるオブジェクトをクリックして、テキストを変えて、、、という作業が、親パネルからリストで選択するだけで変えられるようになるので、とっても簡単。