Movatterモバイル変換


[0]ホーム

URL:


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

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


Unity入門の森オリジナル本格ゲーム制作講座はこちら
11種類の本格ゲームの全ソースコード公開・画像&動画による解説付き

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

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

前回の記事:

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

【Line登録者限定のプレゼントもあるよ!】

列挙型(enum)とは

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

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

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

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

定数について

定数についての画像

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

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

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

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

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

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

constとreadonlyについて
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
classA{
  //両方とも型の前に書く。二つ同時に指定することはできない。
  publicconstintConstant=100;
  publicreadonlyfloatReadonly=10;
}
 
vara=newA();
//後から値は変更できない。
a.Constant=100;// <- NG
a.Readonly=-1;// <- NG
 
//読み込みとしてのみ利用可能。
varn=a.Constant+a.Readonly;

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

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

列挙型の書き方

列挙型の書き方の画像

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

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

  • 通常のもの
  • フラグ

通常の列挙型

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

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

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

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

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

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

列挙型の書き方
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
enumFruits{
  Apple,// == 0
  Banana,// == 1
  Orange,// == 2
  Grape,// == 3
}
 
Fruitsf=Fruits.Apple;
Fruitsf2=Fruits.Orange;
 
stringstr=f.ToString();// str == "Apple"
 
//数値型を指定した列挙型の宣言(ushort型として扱われる)
enumAnimal:ushort{
  Cat=1,
  Dag=100,
}

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

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

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

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

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

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

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

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

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

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

フラグとして扱う列挙型の使い方
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//フラグの場合は手動で値を設定した方がいい。
[Flags]
publicenumFruits{
  Apple  =0b0001,// <- 1
  Banana=0b0010,// <- 2
  Orange=0b0100,// <- 4
  Grape  =0b1000,// <- 8
}
 
//flagにはAppleとGrapeの二つの値が設定されている。
//  数値としては0b1001となっている。
// フラグの合成には|演算子を使う。
Fruitsflag=Fruits.Apple|Fruits.Grape;
 
//値の判定の仕方。フラグの確認には&演算子を使う。
boolisApple=(flag&Fruits.Apple)!=0;// <- true
boolisOrange=(flag&Fruits.Orange)!=0;// <- false

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

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

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

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

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

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

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

列挙型を使ってみよう!
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
usingSystem;
usingUnityEngine;
 
publicclassSample:MonoBehaviour{
  [Flags]
  publicenumMoveOp{
    None=0,
    Up=0x1,
    Down=0x1<<2,
    Left=0x1<<3,
    Right=0x1<<4,
  }
  publicMoveOpMoveFlags=MoveOp.None;
  publicfloatSpeed=1f;//1秒あたりに進む速さ
 
  voidUpdate(){
    transform.position+=GetMove(Speed);
  }
 
  Vector3GetMove(floatspeed){
    speed*=Time.deltaTime;// <- 1フレーム単位の速さに変換している。
 
    varmove=Vector3.zero;
    if(0!=(MoveFlags&MoveOp.Up)){
      move.y+=speed;
    }
    if(0!=(MoveFlags&MoveOp.Down)){
      move.y-=speed;
    }
    if(0!=(MoveFlags&MoveOp.Left)){
      move.x-=speed;
    }
    if(0!=(MoveFlags&MoveOp.Right)){
      move.x+=speed;
    }
    returnmove;
  }
}

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

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

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

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

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

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

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

まとめ

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

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

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

次回の記事:

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

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



Unity入門の森オリジナル本格ゲーム制作講座はこちら
11種類の本格ゲームの全ソースコード公開・画像&動画による解説付き

関連記事

Unity C#入門講座

UnityC# Listの使い方

前回はインターフェースとポリモーフィズムについて学びましたが、今回の記事ではListについて解説していきます。前回の記事:Listは配列をより使いやすくしたコレクションの一つになります。配列より便利なListクラスとはListクラスは配列と...
2021.09.11
Unity C#入門講座
Unity C#入門講座

UnityC# クラスとインスタンスの作り方・コンストラクタの使い方

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

Unity C#の繰り返し処理の使い方 for文・while文・foreach文

今回の記事では繰り返し処理についてみていきます。アプリ開発ではたくさんのデータに対して同じ処理を行いたい時があるのですが、その時に繰り返し処理を利用することになります。前回の条件分岐の制御文と併せてプログラミングの超重要ポイントの一つです。...
2021.09.11
Unity C#入門講座
Unity C#入門講座

Unity C#の条件分岐の使い方 if文・switch文

今回の記事では制御文について解説していきます。制御文にはいくつか分類があるのですが、ここでは条件分岐と呼ばれるif文とswitch文について見ていきます。前回の記事:制御文と条件分岐について制御文とはプログラムの処理を実行するかしないかを制...
2021.09.11
Unity C#入門講座
Unity C#入門講座

UnityC#の例外処理の使い方 throw, try, catch, finally文について

今回の記事では例外処理について解説していきます。例外処理はアプリ実行時に予想していない自体が発生した時に使用するC#の機能になります。例外処理をマスターしてばっちりエラーハンドリングしていきましょう。前回の記事:例外処理とは例外処理とはアプ...
2023.04.23
Unity C#入門講座
Unity C#入門講座

UnityC#の配列の使い方 一次元配列・多次元配列・ジャグ配列

今回の記事では配列について解説していきます。配列を使用することでたくさんのデータを一つの変数にまとめられます。前回の記事:配列(Array)とは配列とは同じ型を持つ値を一つの変数にまとめた参照型の値になります。C#では配列のようにたくさんの...
2021.09.11
Unity C#入門講座

コメント

コメントをどうぞコメントをキャンセル

メールアドレスが公開されることはありません。

CAPTCHA


↓知りたいことを検索してね

Unity入門の森 インディーゲームリリース!

魔女と召喚獣

 

Seeker of Darkness

 

呪術迷宮をリリース

unity入門の森 ゲームの作り方のyoutubeチャンネル

unity入門の森 ゲームの作り方
「unity入門の森 ゲームの作り方」のyoutubeチャンネル。unityを用いたゲームプログラミング、unityスクール、ゲームクリエイターになりたい方向けの情報を中心に発信。インディーゲームクリエイター・プロゲーマー・ゲーム実況者を目...
www.youtube.com

ブログランキング参加中(クリックして応援してくれると嬉しいな)

にほんブログ村 教育ブログ プログラミング教育へ
にほんブログ村

カテゴリー

最近の投稿

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

[8]ページ先頭

©2009-2025 Movatter.jp