# ゲームオーバー UI

現状、ゲームが終わるとき、`Debug.Log` でメッセージを表示しているが、その代わりに Canvas で「ゲームオーバー」を表示し、「さいかい」と「おわり」のボタンを実装しましょう！

## シーンの準備

### スプライト分割

まず、ブロックと同様に、画像を分解しないといけない。ただし、行列ではないので、きれいに縦横で分割できない。この場合は、マウスを使い、各スプライトの領域を定義しましょう：

[![image.png](https://class.illogic.games/uploads/images/gallery/2026-05/scaled-1680-/uY3image.png)](https://class.illogic.games/uploads/images/gallery/2026-05/uY3image.png)

３つのスクリプトを分割したら、「Apply」ボタンを押し、シーンを編集しましょう

### Canvasの準備

すでに作ったゲーム用の Canvas は別目的なので、ゲームオーバー専用の Canvas を新しく作ろう。そして、Image 1つと Image + Button ２つを追加してください：

![image.png](https://class.illogic.games/uploads/images/gallery/2026-05/scaled-1680-/JgMimage.png)

### アニメーションを作成

GameOver オブジェクトに Animator コンポーネントを追加し、アニメーションを作成しましょう。ここは好きなように作成しても問題ない

![image.png](https://class.illogic.games/uploads/images/gallery/2026-05/scaled-1680-/wTYimage.png)

なお、アニメーションを作成した後、無限再生（ループ）を無効化しましょう。Project フォルダーでアニメーションのファイルを探し、クリックしたら、Inspectorで「Loop Time」のチェックボックスからチェックを外してください：

## ![image.png](https://class.illogic.games/uploads/images/gallery/2026-05/scaled-1680-/Cfbimage.png)スクリプト

GameOverManager を作成し、表示「Show」と非表示「Hide」のメソッドを作成し、「Show」の時は、アニメーションを再生しましょう：

```c#
// GameOverを表示・非表示する
public class GameOverManager : MonoBehaviour
{
    // アニメーション再生・停止用
    [SerializeField] 
    private Animator animator;

    // 表示
    public void Show()
    {
        // 定めたアニメーション再生
        // 大文字・小文字を確認！！
        gameObject.SetActive(true);
        animator.Play("ShowGameOver"); 
    }
    
    // 非表示
    public void Hide()
    {
        animator.StopPlayback();
        gameObject.SetActive(false);
    }
}
```

そして、GameManager 側では…

```c#
// ゲーム監督
public class GameManager : MonoBehaviour
{
    // ボールを投げる処理
    [SerializeField] 
    private BallShooter ballShooter;
    
    // ゲームの情報を表示できるように
    [SerializeField] 
    private UIManager uiManager;
    
    // ゲームオーバーの表示・非表示用
    [SerializeField]
    private GameOverManager gameOverManager;

    // 後は同じ
}
```

で、ゲームが始まったら、ゲームオーバーを非表示し、ゲームオーバー（またはゲームクリア）の時はまた表示すれば良いでしょう：

```c#
private void Start()
{
    _lives = 3; // 3個で始まる
    uiManager.SetLives(_lives);
          
    // ゲームオーバー非表示
    gameOverManager.Hide();
}

// ボール廃止されたときに呼び出される
public void BallDestroyed()
{
    // 残機が減る
    _lives--;
    uiManager.SetLives(_lives);
    if (_lives == 0)
    {
        // ゲームオーバーを表示
        gameOverManager.Show();

        // スクリプトを無効化する
        ballShooter.enabled = false;
    }
}

// ブロック廃止のとき呼び出される
public void BlockDestroyed()
{
    // 100点を与える
    _score += 100;
    
    // UIを更新
    uiManager.SetScore(_score);
    
    _blockCount--;
    if (_blockCount == 0)
    {
        // ゲームオーバーを表示
        gameOverManager.Show();
        ballShooter.enabled = false;
    }
}
```

### Unityで確認

GameOverManager のスクリプトを GameOver にアタッチし、GameManager との紐づけできてたら、実行して、確認しましょう！

![image.png](https://class.illogic.games/uploads/images/gallery/2026-05/scaled-1680-/O57image.png)

## ボタンを実装

ボタン（Button）はを押したら、ゲーム監督 GameManager を呼び出し、ゲームを再開するのか、それともゲーム終了するなのかを実装しましょう。

Button から GameManager を呼び出すので、メソッドは「public」にしましょう！ それでは、GameManager に新しいメソッドを追加してください：

```c#
// ゲーム再開ボタンの処理
public void OnGameRestart()
{
    SceneManager.LoadScene("Game");
}

// ゲーム終了ボタンの処理
public void OnGameEnd()
{
    // 独立に実行ファイルの時
    Application.Quit();
    
    // Unityの中で実行する場合
    EditorApplication.ExitPlaymode();
}
```

### Buttonの設定

Buttonコンポーネントを見ると「OnClick」という項目がある。この項目が「ボタンが押したら何を呼び出すか？」という設定場所である。「＋」ボタンを押し、新しい呼び出しを追加しましょう：

![image.png](https://class.illogic.games/uploads/images/gallery/2026-05/scaled-1680-/iVfimage.png)

 ３つの設定できる項目がある：

 ① ゲームオブジェクト：ボタンを押したら、このゲームオブジェクトを呼び出す。普通通りに、ヒエラルキーからドラッグドロップで設定ができる。  
 ② 呼び出したいメソッド：①で選択したゲームオブジェクトのすべてのコンポーネントとスクリプトを表示され、呼び出したいメソッドを選択ができる。  
 ③ 引数：メソッドは引数があれば、ここで設定ができる。引数がない場合は何も表示されない。

今回は、「さいかいボタンを押したら、GameManager オブジェクトの中にある `GameManager.OnGameRestart()` を呼び出したい」にしたいので、OnClick はこうなる：

![image.png](https://class.illogic.games/uploads/images/gallery/2026-05/scaled-1680-/zlpimage.png)

「おわり」ボタンは：

![image.png](https://class.illogic.games/uploads/images/gallery/2026-05/scaled-1680-/yc0image.png)

これでもう一度確認しましょう。