Unity C#での列挙型と定数の使い方

列挙型についての画像 Unity C#入門講座
列挙型は定数をテキストの様に簡単に扱うためのものになる。


Unityの本格ゲーム制作講座はこちら
【30日間の全額返金保証付き】

今回の記事では列挙型と定数について解説していきます。

列挙型を使うとスクリプト上で定数をテキストとして表現でき、より読みやすく設定しやすいコードを書くことができます。

前回の記事:

Unity C#の文字列と文字列処理メソッドの使い方
今回の記事では文字列について解説していきます。 文字列を使える様になると、アプリ上でテキストを表示できるようになります。 ゲーム内でメニュー画面の文字表示やダイアログメッセージを出したりする場合に必須ですね。 またそんな文字列を操作す...

列挙型(enum)とは

列挙型は値型になり、System.Enum型から派生したものになります。

列挙型を使用することで定数に名前をつけることができ、スクリプトが読みやすくなります。

列挙型は定数を簡単に書くことができるものと理解すればOKです。

定数という用語が出てきたので、ここで簡単に説明します。

定数について

定数についての画像

定数は一度設定したら変更できない値のこと。constとreadonlyの2種類ある。

これまで変数を何回も使ってきましたが、プログラミングには一度値を設定したら変更できない定数というものが存在します。定数はアプリのパラメータを表すのに最適な変数になります。

定数には以下のものがあります。使い方としては変数宣言の時に型の前にこれらのキーワードを付け加えるだけになります。

constメンバ宣言の時にのみに値を設定できる。値型とstringのみ使用できる。コンパイル時から固定値

readonlyメンバ宣言コンストラクタ(※)内でのみ値を設定できる。実行時のみの固定値

(※コンストラクタ(Constructor)はクラスの初期化を行うメソッドになり、少し書き方が異なります。詳しくは後ほど解説します。)

constreadonlyの違いは定数として扱われるタイミングが異なりますconstとして宣言された変数はコンパイルのタイミングから定数となりswitch文のcase文に指定できますが、readonlyの場合はできず、実行時の初期化のタイミングから定数になるなどの違いがあります。

また、constは値型のみしかつけることができませんが、readonlyには型に制約はありません

列挙型の書き方

列挙型の書き方の画像

列挙型には通常のものとFlags属性付きのものがある。基本的な書き方は同じで、メンバには数値を設定できるが、何もつけなかったら前のメンバ+1の値になる。初めのメンバの時は0になる。

列挙型には2種類あります。よく使われるそれらの書き方についてみていきます。

  • 通常のもの
  • フラグ

通常の列挙型

列挙型の宣言はenum <列挙型名>{ <定数となるテキスト>, ... }と書きます。

基本的に列挙型のメンバは定義された順に0から始まる連続した数値が設定されます。

列挙型宣言時に=演算子を使用すると好きな数値を設定することができます。その際後ろのメンバには前のメンバの値に+1した数値が設定されます。

列挙型はint型として扱われますが、他の数値型を指定することもできます。

また、ToString()メソッドを使用することで列挙型のテキストを出力することもできます。

enum <列挙型名> : <数値型> { <定数となるテキスト>, ... }

System.Flags属性をつけた列挙型

まだ紹介していないC#の機能になりますが、System.FlagsAttributeという属性(※)を列挙型の定義の部分に書くとその列挙型はフラグとして扱われます。

(※属性(Attribute)はメンバにつけることができる、付加的な情報を表します。使用する際は末尾のAttributeは省略できます。)

フラグは一つの変数に複数の情報を持たせることができます。

なぜなら、情報の有無を0か1のビットで表現する形式だからです

ビット演算が可能なので2進数の1桁目、二桁目それぞれに違う状態を意味する値を設定できます。

例えば、ビットの1桁目で行動A、ビットの二桁目で行動B、ビットの3桁目には行動Cを表すとします。行動中であればビットを1に。行動してなければビットを0にするとします。

このとき、行動Aと行動Cのみ行っていれば、0b0101のように表現できるわけですね(0bを接頭辞で付けると二進数を意味します)。

ビット演算で行動状態の重ね合わせなどもできるので便利です。少々玄人向けの列挙型の使い方になります。

上記の特性から、メンバの定義の際もビット演算を考慮した値を設定する必要があります。

【実践】Unityで実際に列挙型を使ってみよう!

今回のサンプルコードでは設定した列挙型によってGameObjectの移動の仕方を変更させてみましょう!

サンプルコードではMoveOp列挙型でGameObjectの移動方向を定義しています。

InspectorからMoveOp型のMoveFlagsとSpeedを変更することでGameObjectを移動させることができます。MoveFlagsはGetMove()の中で使用しています。

GetMove()メソッドは移動量を求めるメソッドになり、Update()の中で呼び出しています。Update()の中で移動させているので再生中に移動方法を切り替えることができます。

MoveOp列挙型のメンバとGetMove()の処理を追加することで他方向に移動させたり、異なる処理を追加することができるので、余力のある方は試してみてください。

実行する際は適当なGameObjectを作成して、それにサンプルコードのコンポーネントをアタッチしてください。

MoveOp列挙型の書き方がぱっと見難しいと思いますが、それぞれの桁をシフト演算を用いてフラグとして宣言しています(シフト演算の復習はこちら)。

この書き方をすることで、各状態の重ね合わせを表現できるようになります。

例えば、右上移動は右を表す5桁目に1が入っている&上を表す2桁目に1が入っていることで表現可能です。

通常の数値の列挙型を用いる場合は、右上、左上などもそれぞれ別の定数として宣言しなくてはならず管理が大変になります。

今回のサンプルコードの書き方は”ボタン同時押し”や”状態の同時実現”などゲームで頻出する機能を実現する上で利用できるので頑張って理解してみてください。

サンプルコード実行の画像

サンプルコードを実行するとInspectorで設定した方向にGameObjectが移動する。移動スピードはSpeedから調節できる。

まとめ

今回の記事では列挙型について解説してきました。簡単にまとめると以下のようになります。

  • 列挙型は定数をテキストとして扱える様にするもので値型になる。
  • 定数は値を設定した後は変更できない。constreadonlyの2種類ある。
  • constには値型とstringのみ利用でき、コンパイル時から定数として扱われる。
  • readonlyは好きな型に利用でき、実行時の初期化から定数として扱われる。
  • 全ての列挙型はSystem.Enumから派生している。
  • 列挙型のメンバは自動的に数値が割り振られる。
  • 列挙型のテキストはそのまま文字列に変換できたり、対応している数値に変換できる。

それでは次の記事に行ってみましょう!

次回の記事:

UnityC# クラスとインスタンスの作り方・コンストラクタの使い方
今回の記事ではクラスについて解説していきます。 クラスについては複数回に分けて解説します。今回はクラスとインスタンスの基本的な使い方について解説します。 ちなみに構造体(struct)も大体クラスと同じものになり、ここで解説する用法は構...

初心者向けUnityC#入門講座に戻る>>

コメント

タイトルとURLをコピーしました