いのいち勉強日記

Sakana AIでResearch Engineerをしています。京大薬学研究科でPhDをとりました。Kaggle Grandmasterです。

【Unity】シューティングゲームを作ってみよう!《Day 5》列挙型

5日目は「列挙型を使ってゲームの状態を取得」を実装します。

 

 

ゲーム作り5日目

 

今日は、

「ゲームオーバになったらEnemyが出てくるのを止めたい!」

ということで、

ゲームの状態を取得して場合分けをします!

 

そこで使う「列挙型」についてまとめたいと思います!

 

 

列挙型とは?

 

列挙型Enumerateとは「enum」(読み方は「イーナム」) で宣言します。

C#のプログラミングガイドには

列挙型 (列挙値または Enum とも呼ばれます) を利用すると、

変数に割り当てる一連の名前付き整数定数を効率的に定義できます。

 

と書かれています。

 

つまり、私の解釈では、

 

「複数のものや状態を数字(整数)で場合分けする時に、

 まとめて名前付きで定義できますよ!

 だから効率がいいですよ!」

 

ということかと思いました!

 

チュートリアルでは「Day (曜日)」を例にしていました。

曜日は全部で7つと決まっていますし、曜日で場合分けする時に、

「いちいち月曜日には1を代入して・・・」

としていくとめんどくさいですし、まとまりがわかりにくいですね!

 

でも列挙型を使うと「Day」と定義してまとめて定義できますし、

「{Mon, Tue, ...}」と名前をつけていけるので、

実際コードを書いた時は意味のある文字を使って書いていけるので

可読性が上がるのではないかと思います!

 

コメントアウトで「//Monは1で、Tueは2で、・・・」とかくと

コードの行数が増えて言った時いちいち見て確認しないといけないので

ミスが増えてしまいそうな気がします!!!

(そんなコードをいっぱい書いたことないんですが・・・)

 

ですので、列挙型をうまくつかうと

すっきりとわかりやすいコードが書けそうです!

 

列挙型の詳しい説明については以下を参照してください!

 

列挙型の詳しい解説こちらから

 

 

列挙型でゲームの状態を取得

 

では私のゲームで列挙を使って見ます。

 

今回は、

 

「ゲームの状態をプレイモードかゲームオーバーかを認識して、

 プレイモードならEnemyを一定間隔で生成する

 ゲームオーバーになったらEnemyの生成をストップする」

 

というコードを目指しました!

 

これはゲームの進行についてなので

もちろんGameManagerで実装します。

 

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

    enum GAME_STATE {
        PLAY,
        GAMEOVER,
    }

    private GAME_STATE gameState = GAME_STATE.PLAY;

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

 

列挙型で「PLAY」と「GAMEOVER」の二つを定義して

gameStateという変数を宣言し、PLAYの状態で初期化しています!

 

そしてEnemyのインスタンス化はUpdateメソッドの中で

行なっているのですが、そこに条件を加えます!

 

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

void Update () {
        if (gameState == GAME_STATE.PLAY) {
            (Enemyのインスタンス化)
            }
        }
    }

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

 

そして、ゲームオーバになったら、

gameStateにGAME_STATE.GAMEOVERを代入することで

Enemyのインスタンス化を止めることができました!

 

 

まとめ

 

列挙型ってはじめはすごくややこしそうなイメージがあったのですが

使えるとコードがスッキリする気がします!

 

まだまだ使いこなせてないかもしれませんが、

今後もリファレンスをみながらどんどん使うことで

習熟していきたいです!!!

 

次回、6日目は大砲の位置を動かせるようにしたいと思います!

いよいよシューティングゲームっぽくなってくると思います!!!

 

最後まで読んでいただきありがとうございました。