【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と同じ文字列が選択できるようになっているはずです。
これを各パネルで選択しておくだけで、起動すると下記の様にテキストが変換されます。
親パネルを開いて、テキストのあるオブジェクトをクリックして、テキストを変えて、、、という作業が、親パネルからリストで選択するだけで変えられるようになるので、とっても簡単。