TD-ゲームオーバー処理を作る-part12

ゲームに必要な要素は一通り制作出来ました。ここからはゲームのルールに関わる要素を作成しながら、ゲームとして仕上げて行きます。

目次

ゲームオーバーの表示を作る

まずはお約束と言うか先に表示を作成してから、その制御を行っていきたいと思います。

ゲームオーバーパネルを作成とテキスト表示

今回は画像とかは利用せず、テキストのみでゲームオーバーの表示を行います。また、リトライができるようにボタンも準備しましょう。

  • ベースになるパネルを追加
    • Canvasを右クリック>UI>Panel
    • 名前をPanelGameOverに変更
  • テキストを追加
    • PanelGameOverを右クリック>UI>Text – TextMeshPro
    • テキストを変更「Game Over!!」
    • フォントサイズを変更:90
    • Font Style:太字(B)
    • 色を変更:赤
    • Alignment:左右中央、上下中央
    • Wrapping:Disabled(折り返しなし)

リセット用のボタンを追加

続いてボタンを作成します。

  • ボタンの追加
    • PanelGameOverを右クリック>UI>Button – TextMeshProを選択
    • 名前を変更:ResetButton
    • 位置を変更:0 , -350
    • 大きさ変更:Width 350 、Height 75
  • ボタンのテキストを変更
    • Reset
    • 太字
    • フォントサイズ:50

ゲームオーバーの処理作成

ゲームオーバーの処理はお城のHPがなくなったら負けとします。表示との連携も行いますので、インスペクターでのセットを後ほど行います。

お城がやられたことを通知する

ゲームの処理を作る!というはずなんですが、現時点ではお城がやられたことを通知する部分がありません。ゲームを制御するスクリプトを変更する前に、お城がやられたことを通知するための処理を追加しましょう。

Castleスクリプトを次のように変更してください。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;

public class Castle : MonoBehaviour
{
    [SerializeField] private float maxHealth = 100f; // 最大体力
    private float currentHealth; // 現在の体力

    [SerializeField] private HealthBar healthBar; // 体力ゲージ

    public static UnityEvent<Castle> OnAnyDestroyed = new UnityEvent<Castle>();

    private void Start()
    {
        currentHealth = maxHealth;
        healthBar.SetHealth(currentHealth / maxHealth);
    }

    public void TakeDamage(float damage)
    {
        currentHealth -= damage;
        healthBar.SetHealth(currentHealth / maxHealth);
        if (currentHealth <= 0)
        {
            OnAnyDestroyed.Invoke(this);
            Destroy(gameObject);
        }
    }
}

今回はお城1つですが、複数ある場合なんかにもこちらの方法で対処出来ます。ダメージ状況なども知りたい場合は同じようなイベントを追加することで対応可能です。

GameManagerスクリプト

お城がやられたことを通知してくれるようになったところで、本題のGameManagerを作成しましょう。GameManagerにさせたいことは次のようなもの。

  • ゲーム開始時にPanelGameOverを非表示にする。
  • お城のHPが0になったらPanelGameOverを表示する。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameManager : MonoBehaviour
{
    [SerializeField] private GameObject panelGameOver;
    private void Start()
    {
        panelGameOver.SetActive(false);
        Castle.OnAnyDestroyed.AddListener((castle) =>
        {
            panelGameOver.SetActive(true);
        });
    }
}

インスペクターのセット

GameManagerのセットを行いましょう

  • 空のGameObjectを作成
    • 名前を変更:GameManager
    • 位置はあまり関係ないが、Resetしておくと良い
  • コンポーネントのセット
    • GameManagerをアタッチ
    • インスペクターにPanelGameOverをセット

動かして確認

準備が出来たら動かして確認・・・したいところなんですが、意図的にゲームオーバーを起こす必要があります。次のような工夫をして、ゲームオーバーに導いてください。

  • 敵の攻撃力を高くする
  • 敵の数をめっちゃ増やす
  • お城の耐久値を下げる

このあたりはお好みの設定で構いません。一番支障が少ないのは、デバッグ用のクッソ強い敵を追加してテストのときだけ登場してもらうとかが楽な気がします。

このあとの作業で、パネルが出っぱなしだと少し操作がしづらくなるので、PanelGameOverを非表示にしておくと良いですね。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次