【Unity初心者向け】ゲームオーバーの作り方

Unity
スポンサーリンク

今回は初心者向けにUnityでのゲームオーバーの作り方を解説したいと思います

例に使うのは2Dのシューティングゲームです

こちらの記事で未経験者でもゼロから2Dシューティングを作れるように解説していますので参考にしてください

【Unity超初心者向け】2Dシューティングゲームの作り方【全手順画像付きで解説】

本記事で説明するスコア表示はこちらの2Dシューティングをベースとして説明していきます

【Unity初心者向け】ゲームオーバーの作り方

ゲームオーバー」といっても、ゲームごとにどういった処理内容になるのかは仕様次第です

今回はなるべく汎用的になるように次のような処理の例を紹介します

  • 「ゲームオーバー」の文字を表示する
  • ゲームを停止する


記事内では、こちらの簡単なシューティングゲームにゲームオーバー処理を追加していきます

ゲームオーバーの文字を準備する

まずはテキスト表示のようオブジェクトを追加します

上部メニューから「Game Object」→「UI」→「Text」を選択してください

「Canvas」オブジェクトの下「Text」オブジェクトが追加されます

画像は「Text」オブジェクトの名称を「GameOverText」としています

名前はなんでもいいですが、他オブジェクトと区別できる名前がよいかなと思います


GameOverText」オブジェクトのテキストを「GameOver」の文字を入れます

また、今回は文字サイズを大きくして、文字色を白にしました。このあたりはみなさんが作っているゲームの見栄えを考えていい感じにしましょう


私の場合はこんな感じの「GameOver」表示になりました


ゲームオーバーの条件を考える

ゲームオーバーになる条件を考えて、ゲームオーバーを表示する処理を作っていきましょう

まず、サンプルとなるゲームはこのようなシューティングゲームです

右から敵が次々と出てきて、自プレイヤーは上下にのみ動けます

このときのゲームオーバー条件について考えてみましょう

ゲームオーバー条件の案
  • 自プレイヤーと敵が接触したら終了
  • 敵を1体でも倒せなかったら終了

などが考えられます

今回は「敵を1体でも倒せなかったら終了」にしてみましょう


ゲームオーバーテキストを表示する

さっそく処理を作成していきます

まず、ソースコード上で「敵を1体でも倒せなかった場合」の処理を挿入する箇所を探しましょう

サンプルのシューティングゲームの場合は「Enemy.cs」あたりが適切かと思いました

こちらのソースでは

        if (transform.position.x < -10.0f)
        {
            Destroy(gameObject);

	}

ここで「画面外に消えた敵オブジェクトを破棄」しています

このゲームの場合、「敵が画面外に消える = 敵が倒せなかったとき」となるため、ここにゲームオーバーの処理を挿入します

    if (transform.position.x < -10.0f)
    {
        Destroy(gameObject);
        GameObject.Find("GameObject").GetComponent<GameManager>().GameOver();
    }

例えば、このような感じでGameManagerクラスのGameOver()という関数を呼ぶようにします

ここでゲームオーバーテキストを表示する処理を挿入してもいいのですが、あえてまだ作成していないGameOver()という関数を呼んでみました

サンプルのゲームにはGameManagerというゲーム状態を管理するオブジェクトがあるため、オブジェクトの役割分担を考えてゲームオーバー処理をGameManagerが実行する形にしてみました

GameManagerGameOver()を作っていきます。こちらが「GameOver」という文字の表示を担います

	GameObject gameOver;

	// Start is called before the first frame update
	void Start()
	{
		this.gameOver = GameObject.Find("GameOverText");
		this.gameOver.SetActive(false);
	}

	public void GameOver()
	{
		// GameOverテキストの表示
		this.gameOver.SetActive(true);
	}

GameManagerクラスをこんな感じの処理を追加しました

Start()」では「GameOverText」オブジェクトを探して変数内に保持、その後「GameOverText」オブジェクトを非表示にしています
(ゲームを開始した瞬間から「GameOver」の文字が表示されていると変なので、最初に消しておきました)

GameOver()」では「GameOverText」オブジェクトを再びアクティブにすることで「GameOver」という文字を表示しています


ゲームを実行してみます。敵が画面外に消えると、GameOverの文字が出てくるのが分かります

まだだ!まだ終わらんよ!状態をなんとかする

ひとまず「GameOver」というテキストが狙ったタイミングで表示されるようになりました

ただ、ゲームが全体的に停止しないので敵の出現が止まりません

そのため、GameOver後に敵の出現を止める処理を記述していきます

さきほど、GameOver()処理を記述したGameManagerを開き、次のような処理を記述します

	private bool isGameOver = false;

	public void GameOver()
	{
		// GameOverテキストの表示
		this.gameOver.SetActive(true);
		this.isGameOver = true;
	}

isGameOverという変数を追加してみました

さらに、GameOver()内でisGameOverをtrueにしています

これで「ゲームオーバーであるか」という情報を isGameOver という変数から判断できるようになります


GameManagerクラスには次のような敵を出現させる処理があります

	// Update is called once per frame
	void Update()
	{
		timeElapsed += Time.deltaTime;
		if (timeElapsed >= interval)
		{
			timeElapsed = 0.0f;
			Vector3 randamPos = new Vector3(11, Random.Range(3.7f, -3.7f), 0);
			Instantiate(enemyPrefab, randamPos, Quaternion.identity);
		}
	}

ifの中で一定時間ごとに敵を出現させています

ここを isGameOver という変数を使って塞ぎます

	// Update is called once per frame
	void Update()
	{
		timeElapsed += Time.deltaTime;
		if (timeElapsed >= interval && isGameOver == false)
		{
			timeElapsed = 0.0f;
			Vector3 randamPos = new Vector3(11, Random.Range(3.7f, -3.7f), 0);
			Instantiate(enemyPrefab, randamPos, Quaternion.identity);
		}
	}

こんな感じです。ifの条件式「isGameOver == false」が増えています

これでゲームオーバーではないときのみ敵が出現するようになる = ゲームオーバー後に敵が出現しなくなります


実行してみるとゲームオーバー表示後に、敵が出現しなくなるのが分かります


まとめ

というわけで以上、ゲームオーバーの作り方でした

いろいろなやり方があるので「絶対にコレ!」という内容ではありませんが、参考にしていただければと思います

普段何気なくゲームを遊んで何気なくゲームオーバーになりますが、作ってみると結構手間なのがわかるかと思います

ここまで製作できた方は薄々わかるとは思いますが、まだまだ不足している部分はあります

例えば…

  • GameOver後、プレイヤーの動きを止めていない
  • GameOverから再開することが出来ない

などです

まだまだゲームのクオリティをあげたい方はぜひ挑戦してみてください!

ではまたー!

コメント