ゲーム終了処理
次、「ゲームクリア」と「ゲームオーバー」の処理を追加しましょう。
ゲームオーバー
このゲームでは、残機3つがあり、ボールが失ったら残機1つが減る。残機がゼロになった場合は「ゲームオーバー」にする。すでに「ボールが失ったら…」(BallDestroy)という処理があるので、これを活用できる。
ゲーム監督クラス「GameManager」を作成し、残機の数を追跡しましょう。BallDestroyのとき、GameManagerを呼び出し、残機を減らす処理を実装してみましょう:
// ゲーム監督
public class GameManager : MonoBehaviour
{
// 残機の数
private int _lives;
private void Start()
{
_lives = 3; // 3個で始まる
}
// ボール廃止されたときに呼び出される
public void BallDestroyed()
{
// 残機が減る
_lives--;
if (_lives == 0)
{
// とりあえず、コンソールで表示
Debug.Log("ゲームオーバー");
}
}
}
そして、BallDestroy 側では…
// ボールを削除し、お知らせする
public class BallDestroy : MonoBehaviour
{
// BallShooterに知らせる!
[SerializeField]
private BallShooter ballShooter;
// GameManagerにも知らせる!
[SerializeField]
private GameManager gameManager;
// トリガーの中に何か入ったら:
private void OnTriggerEnter2D(Collider2D other)
{
// ゲームオブジェクトを廃止(削除)する
Destroy(other.gameObject);
// メソッドを呼び出し、知らせる
ballShooter.BallDestroyed();
gameManager.BallDestroyed();
}
}
シーンにゲーム監督スクリプトを新しいゲームオブジェクトにアタッチし、BallDestroy の参照を付けてください:

これで3つのボールをなくして、「ゲームオーバー」になることを確認してください。
BallShooter を止める!
ゲームオーバーになっても、次々にボールを投げることができる!これではいけないので、GameManager 側でゲームが終わったことがわかれば、BallShooter を無効化しましょう:
GameManager に Inspector で参照を付けれるようにする:
// ゲーム監督
public class GameManager : MonoBehaviour
{
// ボールを投げる処理
[SerializeField]
private BallShooter ballShooter;
// あとは同じ…
}
そして、ゲームオーバーの時:
if (_lives == 0)
{
// とりあえず、コンソールで表示
Debug.Log("ゲームオーバー");
// スクリプトを無効化する
ballShooter.enabled = false;
}
Unityで参照を設定し、実行してみてください。