今回は、ゲーム全体を管理する監督オブジェクトを作りたいと思います。
Twitterでも書きましたが、ADSLの故障で約1週間ほどPCからネットが出来ませんでした。本当は連続更新が続いていたので、短いスパンで投稿し続けたかったんですけど、ごめんなさい!
本題に戻り、ゲームが開始してからゲームオーバーになるまでの一連の流れを作りますね。
ゲーム全体をコントロールするスクリプトの作成
まずは、プレイヤーコントローラを修正します。敵に接触したらゲームオーバーにする処理を
付け加えるためですね。
IsDeadというフラグを用意しました。敵に接触したらtrueとなりゲームオーバーになります。
また、監督スクリプトからチェックすることになります。
ChangeIKメソッドは、isKinematicをオンオフするメソッドで、Unityちゃんがジャンプ出来るのか出来ないのかを管理します。このメソッドは正直絶対必要ではないんですが、こういった事も出来るよという意味で付けておきます。
ゲームスタート時やゲームオーバー時にジャンプ操作を不可にするといった際に便利です。
当たり判定はOnCollisionEnter2Dを使います。敵に「enemy」というタグを用意して敵に接触したかを判別するようにします。
ディレクタースクリプトを作成する
using System.Collections; | |
using System.Collections.Generic; | |
using UnityEngine; | |
using UnityEngine.SceneManagement; | |
public class Director : MonoBehaviour | |
{ | |
public UnitychanController unitychan; | |
public GameObject enemy; | |
enum State | |
{ | |
Ready, | |
Play, | |
GameOver | |
} | |
State state; | |
// Start is called before the first frame update | |
void Start() | |
{ | |
Ready(); | |
} | |
// Update is called once per frame | |
void Update() | |
{ | |
switch (state) | |
{ | |
case State.Ready: | |
if (Input.GetButtonDown("Fire1")) GameStart(); | |
break; | |
case State.Play: | |
if (unitychan.IsDead()) GameOver(); | |
break; | |
case State.GameOver: | |
if (Input.GetButtonDown("Fire1")) Reload(); | |
break; | |
} | |
} | |
void Ready() | |
{ | |
state = State.Ready; | |
unitychan.ChangeIK(false); | |
enemy.SetActive(false); | |
} | |
void GameStart() | |
{ | |
state = State.Play; | |
unitychan.ChangeIK(true); | |
enemy.SetActive(true); | |
} | |
void GameOver() | |
{ | |
state = State.GameOver; | |
BackScroll[] backscroll = FindObjectsOfType<BackScroll>(); | |
foreach (BackScroll so in backscroll) so.enabled = false; | |
} | |
void Reload() | |
{ | |
SceneManager.LoadScene("2daction"); | |
} | |
} | |
ゲームの状態を判別するために、3つのステートを用意します
Readyステート
その名の通り、ゲームスタート時のステートです。この時点で急に敵が出現するのを防ぎます。
enemy.SetActive(false)がその部分です。ちなみに、雲は初期状態からスクロールするようにしています。その方が自然な感じがしたので。
画面がタップされると、Playステートに遷移して敵が出現するようになります。
Playステート
Unityちゃんを操作出来る状態です。敵が出現するので、回避するようにします。
敵に接触したらIsDeadをtrueにして、GameOverメソッドに進みます。
GameOverステート
敵と雲のスクロールを停止して、ゲームオーバーとなります。
スクロールの停止は、Find関数を使ってBackScrollがアタッチされているオブジェクトを探してenabledフラグをfalseにすることで停止させることが出来ます。
今後ゲームオーバー用のテキストを配置するのでよりゲームオーバーっぽくなると思います。この状態で画面がタップされたら、Reloadメソッドにアクセスし自シーンを読み込こんで初期化します。
スクリプトが完成したら新規で空のオブジェクトを作成し、このスクリプトをアタッチします。
アウトレット接続で、UnityちゃんとEnemyオブジェクトを設定してください。
ゲームを実行するとゲームスタートからスクロール停止まで確認出来ます。
次回は、ゲームにテキストの配置を行います。