ブロック崩し(breakout)を簡単に作成。Part3.終了判定と終了画面|Unityゲーム制作

Unity2Dで「ブロック崩し(breakout)」を作成。Part3では終了判定と終了画面を実装していきます。

はじめに

part1は下記から。

今回やる事

Part1ではパドルとボールを作成、Part2は「ブロックを壊す」、「スコア加算」、「ボール消失」を実装しました。Part3では「終了判定」と「終了画面」を実装していきます。

作成開始

終了画面を作成した後、細かい修正をしていきます。

終了画面を作成

新規でシーンを作成してシーン名を「gameover」にします。Hierarchyメニューで「UI」→「Legacy」→「Text」を2つ追加します。

名前を「TitleText」、「ScoreText」に変更して好きな位置に変更します。

新規オブジェクトを追加して名前を「GameOver」に変更、同名でスクリプトを追加します。

スクリプトの変更

GameManagerスクリプトを下記に変更します。読み込むシーンがない場合、ゲームクリアとしています。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
using System;
using UnityEngine;
using UnityEngine.SceneManagement;
public class GameManager : MonoBehaviour
{
public static GameManager instance { get; private set; }
public String TitleText;
public int score = 0;
private int stage = 1;
private int life = 3;
private void Awake()
{
instance = this;
DontDestroyOnLoad(gameObject);
}
private void Start()
{
LoadStage(1);
}
private void LoadStage(int stage)
{
this.stage = stage;
String scenePath = "stage" + stage;
if (SceneUtility.GetBuildIndexByScenePath(scenePath) == -1)
{
TitleText = "GAME CLEAR";
GameOver();
}
else
SceneManager.LoadScene(scenePath);
}
public void AddScore(int score)
{
this.score += score;
}
public void NextStage()
{
LoadStage(this.stage + 1);
}
public void DecLife()
{
this.life--;
if (this.life <= 0)
{
TitleText = "GAME OVER";
GameOver();
}
else
{
GameObject.Find("Ball").GetComponent<Ball>().ResetBall();
}
}
private void GameOver()
{
SceneManager.LoadScene("gameover");
}
}
using System; using UnityEngine; using UnityEngine.SceneManagement; public class GameManager : MonoBehaviour { public static GameManager instance { get; private set; } public String TitleText; public int score = 0; private int stage = 1; private int life = 3; private void Awake() { instance = this; DontDestroyOnLoad(gameObject); } private void Start() { LoadStage(1); } private void LoadStage(int stage) { this.stage = stage; String scenePath = "stage" + stage; if (SceneUtility.GetBuildIndexByScenePath(scenePath) == -1) { TitleText = "GAME CLEAR"; GameOver(); } else SceneManager.LoadScene(scenePath); } public void AddScore(int score) { this.score += score; } public void NextStage() { LoadStage(this.stage + 1); } public void DecLife() { this.life--; if (this.life <= 0) { TitleText = "GAME OVER"; GameOver(); } else { GameObject.Find("Ball").GetComponent<Ball>().ResetBall(); } } private void GameOver() { SceneManager.LoadScene("gameover"); } }
using System;
using UnityEngine;
using UnityEngine.SceneManagement;

public class GameManager : MonoBehaviour
{
    public static GameManager instance { get; private set; }
    public String TitleText;
    public int score = 0;

    private int stage = 1;
    private int life = 3;

    private void Awake()
    {
        instance = this;
        DontDestroyOnLoad(gameObject);
    }
    private void Start()
    {
        LoadStage(1);
    }

    private void LoadStage(int stage)
    {
        this.stage = stage;
        String scenePath = "stage" + stage;
        if (SceneUtility.GetBuildIndexByScenePath(scenePath) == -1)
        {
            TitleText = "GAME CLEAR";
            GameOver();
        }
        else
            SceneManager.LoadScene(scenePath);
    }

    public void AddScore(int score)
    {
        this.score += score;
    }
    public void NextStage()
    {
        LoadStage(this.stage + 1);
    }
    public void DecLife()
    {
        this.life--;

        if (this.life <= 0)
        {
            TitleText = "GAME OVER";
            GameOver();
        }
        else
        {
            GameObject.Find("Ball").GetComponent<Ball>().ResetBall();
        }
    }
    private void GameOver()
    {
        SceneManager.LoadScene("gameover");
    }
}

GameOverスクリプトを下記に変更します。タイトルをセットしてゲームクリアとゲームオーバーを切り替え、スコアを表示します。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
using UnityEngine;
using UnityEngine.UI;
public class GameOver : MonoBehaviour
{
[SerializeField] private Text TileText;
[SerializeField] private Text ScoreText;
private void Start()
{
TileText.text = GameManager.instance.TitleText;
ScoreText.text = "SCORE: " + GameManager.instance.score.ToString();
}
}
using UnityEngine; using UnityEngine.UI; public class GameOver : MonoBehaviour { [SerializeField] private Text TileText; [SerializeField] private Text ScoreText; private void Start() { TileText.text = GameManager.instance.TitleText; ScoreText.text = "SCORE: " + GameManager.instance.score.ToString(); } }
using UnityEngine;
using UnityEngine.UI;

public class GameOver : MonoBehaviour
{
    [SerializeField] private Text TileText;
    [SerializeField] private Text ScoreText;

    private void Start()
    {
        TileText.text = GameManager.instance.TitleText;
        ScoreText.text = "SCORE: " + GameManager.instance.score.ToString();
    }
}

パラメータをセットします。

BuildSettingsにシーンを追加します。

これでブロック崩しゲームの一通りの流れが完成です。

ボールの動きを調整

少し補足で、ボールの動きを調整していきます。

開始時のボール

まずは初期のボール(ゲーム開始時)に角度を付けます。下記のようにスクリプトを変更して、ランダムに角度をつけます。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
public void ResetBall()
{
transform.position = Vector2.zero;
float x = Random.Range(-0.5f, 0.5f);
rigidbody.velocity = new Vector2(x, -speed);
}
public void ResetBall() { transform.position = Vector2.zero; float x = Random.Range(-0.5f, 0.5f); rigidbody.velocity = new Vector2(x, -speed); }
    public void ResetBall()
    {
        transform.position = Vector2.zero;

        float x = Random.Range(-0.5f, 0.5f);
        rigidbody.velocity = new Vector2(x, -speed);
    }

跳ね返りの調整

次にパドルのBoxcollider2DをPolygonCollider2Dに変更して下記のようにコライダーをセットします。

実行すると下記のようにボールの動き(跳ね返り)が良い感じになります。

実際はここから更に修正する部分がたくさんあります。

例えば、各ステージにスコアを表示したり、ボールの残り数を表示、ブロックが壊れたときのアニメーションや壊れないブロックを作成など。ここからの調整が一番時間が掛かり、大変だったりします。

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