2Dアクションにおけるステートの切り替え【Unity2D】

今回は、ゲーム全体を管理する監督オブジェクトを作りたいと思います。

Twitterでも書きましたが、ADSLの故障で約1週間ほどPCからネットが出来ませんでした。本当は連続更新が続いていたので、短いスパンで投稿し続けたかったんですけど、ごめんなさい!

本題に戻り、ゲームが開始してからゲームオーバーになるまでの一連の流れを作りますね。

スポンサーリンク

ゲーム全体をコントロールするスクリプトの作成

まずは、プレイヤーコントローラを修正します。敵に接触したらゲームオーバーにする処理を
付け加えるためですね。

プレイヤースクリプトの修正

IsDeadというフラグを用意しました。敵に接触したらtrueとなりゲームオーバーになります。
また、監督スクリプトからチェックすることになります。

ChangeIKメソッドは、isKinematicをオンオフするメソッドで、Unityちゃんがジャンプ出来るのか出来ないのかを管理します。このメソッドは正直絶対必要ではないんですが、こういった事も出来るよという意味で付けておきます。

ゲームスタート時やゲームオーバー時にジャンプ操作を不可にするといった際に便利です。

当たり判定はOnCollisionEnter2Dを使います。敵に「enemy」というタグを用意して敵に接触したかを判別するようにします。

ディレクタースクリプトを作成する

ゲームの状態を判別するために、3つのステートを用意します

Readyステート

その名の通り、ゲームスタート時のステートです。この時点で急に敵が出現するのを防ぎます。

enemy.SetActive(false)がその部分です。ちなみに、雲は初期状態からスクロールするようにしています。その方が自然な感じがしたので。

画面がタップされると、Playステートに遷移して敵が出現するようになります。

Playステート

Unityちゃんを操作出来る状態です。敵が出現するので、回避するようにします。
敵に接触したらIsDeadをtrueにして、GameOverメソッドに進みます。

GameOverステート

敵と雲のスクロールを停止して、ゲームオーバーとなります。
スクロールの停止は、Find関数を使ってBackScrollがアタッチされているオブジェクトを探してenabledフラグをfalseにすることで停止させることが出来ます。

今後ゲームオーバー用のテキストを配置するのでよりゲームオーバーっぽくなると思います。この状態で画面がタップされたら、Reloadメソッドにアクセスし自シーンを読み込こんで初期化します。

スクリプトが完成したら新規で空のオブジェクトを作成し、このスクリプトをアタッチします。
アウトレット接続で、UnityちゃんとEnemyオブジェクトを設定してください。

ステート毎の処理を実装した様子

ゲームを実行するとゲームスタートからスクロール停止まで確認出来ます。
次回は、ゲームにテキストの配置を行います。