Unityでの2Dアクションゲームの作成(GameOverとリスタート)


[前回](https://qiita.com/tokoroten_346/items/989fae2328505e6bf5a6)で敵キャラクターの当たり判定を作ってカエル君が消滅するようにしたので、敵キャラと衝突 or 落下時にGameOverとなりリスタートするような処理を作ります。


まずは穴に落ちたらゲームオーバーとなるようにしていきます。

HierarchyビューからCreate Emptyを選択します、場外の判定をつけるので名前はOutsideとします。
OutsideへAdd ComponentでBox Collider 2Dを追加します。落下時の判定を付けるためにポジションを変更してステージの下部に設置、Box Collider 2DのX方面のSizeをこんな感じで大きくします。
![rapture_20210517223625.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542570/ab4d473f-fb68-7b29-d51c-64fdad2e1b4f.jpeg)

ぶつかった事を検知するためにIs Triggerにチェックを入れ、何にぶつかったかを判定するためにTagを選択してAdd TagからTagを付けます。ぶつかったらゲームが終了するためにTagの名前はGameOverとでもしておきます。

Add tagにGameOverを作成して
![rapture_20210518225205.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542570/bba8cfd4-73b2-0c31-92dc-0549f69f5831.jpeg)

Tagを付けてTriggerにチェックを入れるとこんな感じ
![rapture_20210518225417.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542570/39a65e97-6036-174e-bd85-b77db7f7d317.jpeg)

次にスクリプトのPlayerManagement.csを開いてGameOverに触れた時の処理を書いていきます。
既に記述してある"OnTriggerEnter2D"内へ以下のようにGameOver tagに触れた時にデバッグコンソールへ文字を出す処理を追加します。

```C#:PlayerManagement.cs
private void OnTriggerEnter2D(Collider2D collision)
{
    (途中省略)

   if(collision.gameObject.tag == "GameOver")
   {
      Debug.Log("ゲームオーバー");
   }
}
```

動かしてみるとこんな感じ。
![rapture_20210530000742.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542570/d9aa2778-015e-0ceb-d85e-de45a1d59875.jpeg)

落下してGameOvet tagへ触れた時にゲームオーバーと表示するようになりました。

次にコンソールだけでなく画面上にもゲームオーバーを表示するようにしていきます。Hierarchyビューの＋を選択してUI>Textを選択。

![テキスト.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542570/83b261d3-59a0-13d4-46af-337bcce1b6b0.jpeg)

テキストが出来るので選択してポジションを全て0へ変更。
![rapture_20210530230620.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542570/4f488ae1-abd0-a98b-09fd-23b7e2d8f89d.jpeg)

その状態で再生を行うと画面の中央にテキストが表示されるようになります。
![rapture_20210530231239.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542570/84206b05-bff5-5dcb-4ae1-fe91ec66fc8e.jpeg)

TextのInspectorから表示するText、縦横の大きさ、フォントサイズ、色などを変更していきます。
![rapture_20210530232410.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542570/cf0a12ad-82c9-1314-9a76-e7896e611fa3.jpeg)
いじるとこんな感じ。
![rapture_20210530232421.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542570/9e52a8f6-0211-1c17-3d1e-0b1c7fba2686.jpeg)
これで大きく表示できるようになりました。

テキストの名前をGameOverTextに変更した後にチェックを外しいったん非表示にします。
![rapture_20210531213731.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542570/56e08fe4-233a-76f6-79eb-8ac60f0c564c.jpeg)

GameOver tagに触れた時にテキストが表示されるようにスクリプトを書いていきます。

HierarchyビューからCreate Emptyを選択してGameObjectを作ります、名前はGameManagerにしておきます。スクリプトにもGameManagerを作成してObjectの方へドラッグアンドドロップ。

![rapture_20210531215037.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542570/db1a0c91-de01-5892-e6e0-cad524661a98.jpeg)

GameManagerへGameOverテキストを呼び出すスクリプトを書いていきます。

```C#:GameManager.cs
private void OnTriggerEnter2D(Collider2D collision)
{
	public GameObject gameoverText;

	public void GameOver()
	{
		// GameOverテキストを呼び出す
		gameoverText.SetActive(true);
	}
}
```

PlayerManagementの方へ記述を追加してGameOver tagやEnemy tagに触れた場合にGameOver()を呼び出すようにします。

```C#:PlayerManagement.cs
private void OnTriggerEnter2D(Collider2D collision)
{
    public GameManager gamemanager;
 
   (途中省略)

    // トリガーが発生した時の処理
	private void OnTriggerEnter2D(Collider2D collision)
	{
        // 接触したオブジェクトのtag名がEnemyの場合は
		if(collision.gameObject.tag == "Enemy")
		{
            // Playerオブジェクトを消去する
            Destroy(this.gameObject);
            // ゲームオーバーを呼び出す
            gamemanager.GameOver();
		}
        if(collision.gameObject.tag == "GameOver")
		{
            Debug.Log("ゲームオーバー");
            // ゲームオーバーを呼び出す
            gamemanager.GameOver();
		}
	}
}
```

スクリプトを書いたらPlayerとGameManagerへ設定していきます。
![rapture_20210531221623.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542570/7728cf5b-195d-85ff-70fa-57932299a17a.jpeg)
![rapture_20210531221644.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542570/5c2f1994-5a22-6617-72c7-fc693cb0b829.jpeg)


設定出来たら再生を行います。画面外に落ちるとGAME OVERが表示されるようになっています。
![Gameover.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542570/98ec4730-9281-507e-4f92-c302684fc796.gif)

GameOverになったらリスタートする処理も追加していきます。GameManager.csへ
using UnityEngine.SceneManagement
を追加してしてシーンを取得してロードするGameRestart()を作成します。

```C#:GameManager.cs
using UnityEngine.SceneManagement;

private void OnTriggerEnter2D(Collider2D collision)
{
	public GameObject gameoverText;

	public void GameOver()
	{
		// GameOverテキストを呼び出す
		gameoverText.SetActive(true);
        // GameRestartを呼び出して2秒間待つ
		Invoke("GameRestart", 2);
	}

	public void GameRestart()
	{
		// 現在のシーンを取得してロードする
		Scene activeScene = SceneManager.GetActiveScene();
		SceneManager.LoadScene(activeScene.name);
	}
}
```

以下のように落下したり敵キャラとぶつかるとGAME OVER表示が出現し2秒後にリスタート出来るようになりました。
![Gameover2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542570/c2aebf4d-b8f8-3c23-9693-73e75990cbae.gif)