ゲームオーバー処理の作り方(ステージから落ちたらゲームオーバーにする)

前回の作業でひとまずステージクリア処理を作れたので、ここではゲームオーバー処理を作っていきましょう。

スポンサーリンク

ゲームオーバーの判定処理について

ではゲームオーバー処理を作る前に「どうやってゲームオーバーを判定するか?」という方法考えてみましょう。

今回はユニティちゃんがステージから落ちたらゲームオーバーにしたいです。そこでパッと思いつくやり方としては次の2通りが考えられます。

  1. 広いトリガーを用意して、そこにユニティちゃんが触れたらゲームオーバーとする方法
  2. ユニティちゃんのY座標が一定の値よりも小さくなったらゲームオーバーとする方法

…まあ基本的にはどちらでも構わないのですが、方法1だといちいちトリガーを用意しないといけないので少し面倒です。なのでここでは方法2を採用しますね。

スポンサーリンク

ゲームオーバー処理の作り方

そうしたら早速C#スクリプトを書いてゲームオーバー処理を作っていきましょう。

ユニティちゃんの座標チェック用スクリプトを書く

まずはユニティちゃんの座標チェック用スクリプトを作ります。適当なフォルダに新しく「PlayerPositionCheck」という名前のスクリプトを作り、次のコードを書いてください。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerPositionCheck : MonoBehaviour
{
[SerializeField]
float positionY = -5;
Transform player;
GameManager gameManager;
void Start()
{
player = GameObject.FindGameObjectWithTag("Player").transform;
gameManager = GameObject.FindGameObjectWithTag("GameController").GetComponent<GameManager>();
}
void Update()
{
if(player.position.y <= positionY)
{
gameManager.GameOver();
}
}
}
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerPositionCheck : MonoBehaviour { [SerializeField] float positionY = -5; Transform player; GameManager gameManager; void Start() { player = GameObject.FindGameObjectWithTag("Player").transform; gameManager = GameObject.FindGameObjectWithTag("GameController").GetComponent<GameManager>(); } void Update() { if(player.position.y <= positionY) { gameManager.GameOver(); } } }
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerPositionCheck : MonoBehaviour
{

  [SerializeField]
  float positionY = -5;

  Transform player;
  GameManager gameManager;

  void Start()
  {
    player = GameObject.FindGameObjectWithTag("Player").transform;
    gameManager = GameObject.FindGameObjectWithTag("GameController").GetComponent<GameManager>();
  }

  void Update()
  {
    if(player.position.y <= positionY)
    {
      gameManager.GameOver();
    }
  }

}

書けたらUnitychanオブジェクトのプレハブを開いて今書いたスクリプトをアタッチしてください。プレハブを変更すればシーンに配置されているインスタンスのUnitychanオブジェクトにも変更が適用されます。

GameManagerのスクリプトを変更する

次にステージクリア処理と同じ要領でGameManagerのC#スクリプトを下記のように変更します(※関係ないところは省略してあります)。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
//省略
public void GameOver()
{
if (isClear || isGameOver)
{
return;
}
isGameOver = true;
//★ここにゲームオーバー時の処理
//★追加2
//プレイヤーを止める
KurokumaCharacterController player = GameObject.FindGameObjectWithTag("Player").GetComponent<KurokumaCharacterController>();
player.IsActive = false;
player.StopCharacter();
//ゲームオーバー画面を出す
Instantiate(gameOverCanvasPrefab);
}
public void Retry()
{
//★追加2
moveSceneManager.MoveToScene(moveSceneManager.CurrentSceneNum);
}
//省略 public void GameOver() { if (isClear || isGameOver) { return; } isGameOver = true; //★ここにゲームオーバー時の処理 //★追加2 //プレイヤーを止める KurokumaCharacterController player = GameObject.FindGameObjectWithTag("Player").GetComponent<KurokumaCharacterController>(); player.IsActive = false; player.StopCharacter(); //ゲームオーバー画面を出す Instantiate(gameOverCanvasPrefab); } public void Retry() { //★追加2 moveSceneManager.MoveToScene(moveSceneManager.CurrentSceneNum); }
//省略

public void GameOver()
{
  if (isClear || isGameOver)
  {
    return;
  }

  isGameOver = true;

  //★ここにゲームオーバー時の処理

  //★追加2
  //プレイヤーを止める
  KurokumaCharacterController player = GameObject.FindGameObjectWithTag("Player").GetComponent<KurokumaCharacterController>();
  player.IsActive = false;
  player.StopCharacter();

  //ゲームオーバー画面を出す
  Instantiate(gameOverCanvasPrefab);
}

public void Retry()
{
  //★追加2
  moveSceneManager.MoveToScene(moveSceneManager.CurrentSceneNum);
}

※ついでにリトライ処理も書いておきました。

スポンサーリンク

テストプレイしてゲームーオーバー処理の動作を確認する

ここまでできたら実際にテストプレイして動作を確かめましょう。

試しにシーンのPlaneのY座標を「-5」にしてゲームを実行してみてください。下のGIFのようにゲームオーバー画面が表示されれば成功です。

ゲームオーバー処理の例

(クリックで再生)

※ステージクリア処理のときと同じく、現時点ではゲームオーバー画面のボタンが上手く動作しませんがその点は後で対処します。


次のページ→ProBuilderの基本的な使い方&ステージの作り方