ブロック崩しゲームで状態管理を作成する第3回目です。今回は「終了画面」(ゲームクリア・ゲームオーバー)の実装をしていきます。
はじめに
今回は第3回目です。第1回目は下記から。
前回までのおさらい、今回やる事
前回までで「メニュー」から「ゲーム」の部分を作成しました。今回は「ゲーム」から「終了」を作成していきます。
終了の作成
終了は「ゲームクリア」と「ゲームオーバー」の2つのパターンがあります。
ゲームオーバーの作成
まずはゲームオーバーを作成していきます。ボールが無くなったらゲームオーバーを表示します。まずはGameManagerのスクリプトを下記に変更。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class GameManager : MonoBehaviour { public GameObject ballPrefab; public GameObject playerPrefab; public GameObject panelMenu; public GameObject panelFinish; public Text finishText; public static GameManager instance { get; private set; } public int Balls; public enum Status { MENU, GAME, FINISH } Status _status; void Start() { instance = this; ChangeStatus(Status.MENU); } void Update() { switch (_status) { case Status.GAME: if (Balls > 0) { } else { finishText.text = "GAME OVER"; ChangeStatus(Status.FINISH); } break; case Status.FINISH: break; default: break; } } public void StartClick() { ChangeStatus(Status.GAME); } void ChangeStatus(Status nextstatus) { _status = nextstatus; switch (nextstatus) { case Status.MENU: panelMenu.SetActive(true); break; case Status.GAME: panelMenu.SetActive(false); Instantiate(playerPrefab); Instantiate(ballPrefab); break; case Status.FINISH: panelFinish.SetActive(true); break; } } }
追加したpublic変数をセット。Ballsは1に。
次にBallsスクリプトを下記に変更。ボールが画面外に消えたらボールの数を減らします。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Balls : MonoBehaviour { float _speed = 7.0f; Rigidbody2D _rigidbody; Vector2 _velocity; Renderer _renderer; void Start() { _rigidbody = GetComponent<Rigidbody2D>(); _renderer = GetComponent<Renderer>(); _rigidbody.velocity = Vector2.down * _speed; } void FixedUpdate() { _rigidbody.velocity = _rigidbody.velocity.normalized * _speed; _velocity = _rigidbody.velocity; if (!_renderer.isVisible) { GameManager.instance.Balls--; Destroy(gameObject); } } private void OnCollisionEnter2D(Collision2D collision) { _rigidbody.velocity = Vector2.Reflect(_velocity, collision.contacts[0].normal); } }
これで一度動かしてみて、ボールが下に落ちてゲームオーバーになればとりあえずOK。もちろん、まだまだ未完成です。
ゲームクリアの作成
次にゲームクリアを作成します。「ステージ」の考えを仮導入します。既にあるStage1をプレハブ化。
GameManagerスクリプトにステージ部分を追加。
追加した部分を一部抜き出したのは下記です。
public class GameManager : MonoBehaviour { public GameObject stagePrefab; public enum Status { MENU, GAME, FINISH } Status _status; GameObject _stage; void Update() { switch (_status) { case Status.GAME: if(_ball == null) { if (Balls > 0) { } else { finishText.text = "GAME OVER"; ChangeStatus(Status.FINISH); } } if (_stage !=null && _stage.transform.childCount == 0) { finishText.text = "GAME CLEAR"; ChangeStatus(Status.FINISH); } break; default: break; } }
試しに、ゲームクリアになるか動かしてみます。全てのブロックを消すのは少し面倒なので、一つだけの仮ステージのプレハブを作成して、それを変数にセット。
これで動かしてみて、ブロックを崩してゲームクリアが表示されればとりあえずOK。
もちろん、直すところは多く、気になる部分もある状態ですが、とりあえずは「ゲームオーバー」と「ゲームクリア」の骨組みは完成。