Unityでインディゲーム道!

プログラム、Unity初心者がインディゲーム制作を目指して日々思うことなどを書き綴ります。

ゲームのプログラミングにおいても重要な『列挙体』 "Enum" について。

人間にとって、意味のない識別番号を読みやすく、理解しやすくするために、列挙体"enum"は重要な存在!

※2017/07/12 じゃんけんの例を追記 

ゲームと列挙体

ドラクエのやくそう、ポケモンモンスターボールなど。ゲームにおいて、アイテムというものは無くてはならない存在です。

これらのアイテムにはプログラム内部で、それぞれ識別番号が割り当てられています。おそらくこの二つのアイテムは序盤から出てくるアイテムなので、一桁台の番号が割り振られているのだろうと思います。

 

プログラムのアイテムを使うメソッド、例えばUseItemの内部の処理は、この数字に応じて、その処理を分岐させているとします。このような分岐の場合、switch文の方がいいかと思いますが、わかりやすさ優先でif文として書きます。

if ( item = = 1 ){ //やくそうの処理。対象のキャラのHPを回復させるコード }

この"item"はプレイヤーが使用する、アイテムの番号がストアされている変数になります。ここでの"1"というのは、やくそうに割り当てられた数字ですが、数字自体には意味がありません。機械的に割り当てているからです。

 

このように、何らかの項目、状態を表すのに機械的に数字を割り当てるが、数字自体に意味がない場合は列挙体"enum"を使うのが良いとされます。

 

なぜ列挙体を使うべきか?

それは、人間にとってわかりやすいからです。

数字自体に意味がない場合、コンピュータには分かっても、人間にはその数字が何を意味するか分かりません。

前例のコード"1"は薬草を表していますが、これを人間が理解するためには、資料のアイテム表に書いてある、No.1の項目をいちいち確認しなければなりません。

アイテムが10個ぐらいだったら覚えられるでしょうが、現代のゲームのアイテム数は軽く100を超えるでしょうから、これは大変です。

 

読みやすいコードに!

読みやすいコードを書こう!ということは散々繰り返し目にしますが、そのための具体的な対策のひとつとなるのが、列挙体かもしれません。

enum Item{

Stone,

Yakusou,

Water,

Wine,

Beer,

Bread,

Bell,

//以下略

}

数字を特に指定しなければ、自動的に0から割り当てられます。この場合、Stoneには0、Wineには3が割り当てられています。

よって、薬草のコードは次のように書き直せます。 

if( item = = Item.Yakusou ) { player.HP += 20;  }

これでわざわざ資料のアイテム表を確認しなくても、コードを見るだけで分かる説明的な、自明なコードになりました。

やくそうを使って、HPが20回復する!とすぐに分かります。逆に、もし処理文がplayer.HP -= 20;とかになってたら、やくそうでダメージ食らうわけないよな?と考えますし、そういう意味で間違い防止にもなります。

アイテムだけではなく、武器防具にも使えますし、キャラクターの状態、つまりノーマル、毒、マヒ、ねむり、せんとうふのう、を表すのにも有用なようです。

 

じゃんけんの手の形

また、じゃんけんの手の形を表すのにも列挙体を使うことが出来ます。

グー、チョキ、パー0,1,2で表すとします。 

0は丸いので、ぎりぎりグーと見えなくもないかもですが、他は意味不明です。

さらには、じゃんけんの優劣関係により、0は1に勝ち、1は2に勝ち、2は0に勝つ、ということになり、さらに意味不明になってしまいます。

しかし、列挙体を使えば・・・

enum HandForm{

Goo,

Choki,

Pah

}

というように書き表すことができ、わかりやすいですね。

 

Unityにおける列挙体"enum"

せっかくなので、ブログのテーマ的にもUnityの中で列挙体がどう使われているかという実例を見ていきたいともいます。

  

CusorLockMode

Cusor.lockStateと併せて使います。マウスカーソルの状態を示すenumです。PCゲームの場合、ゲーム中PC側のカーソルを動かしたくないときに、

Cusor.lockState = CusorLockMode.Locked;

とすると、動かなくなります。さらにCusor.visible = false;で見えなくします。まさしく、何かの状態を表すのに使われていますね。

Rigidbody ForceMode

RigidbodyのAddForeceメソッドのオーバーロードとして、ForceModeが用意されており、力の加え方を選択できます。ForceMode.Impulseは爆発やジャンプの際の力の加わり方を表すのに使われます。

rb.AddForce ( Vector3.up * jumpForce, ForceMode.Impulse );

Force, Acceleration, Impulse,  VelocityChangeという4つの状態が含まれます。

 

まとめ!

というわけで簡単にですが、列挙体の有用性について、まとめてみました。

はじめは列挙体という名前にピンと来なかったんですが、わかってくるとゲームを作る上で無くてはならないものだとわかり、その有用性に感動しました。

読みやすいコードを書くのに、こんな便利な道具があるんだと!

上手く使いこなせるようにしたいです。