ブロック崩しゲームで状態管理を中心にゲーム作成。Part3.ゲームクリア・ゲームオーバー作成【Unityゲーム制作】

ブロック崩しゲームで状態管理を作成する第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。

もちろん、直すところは多く、気になる部分もある状態ですが、とりあえずは「ゲームオーバー」と「ゲームクリア」の骨組みは完成。

タイトルとURLをコピーしました