Unity 6.3 LTS|3D的当てゲームを作ろう⑤ HPとゲームオーバーを作ろう

HPが0になりGAME OVERと表示されたUnityの3D的当てゲーム Unity

第5回ではPlayerにHPを追加します。敵弾に当たるたびにHPを1減らし、0になったら画面へ「GAME OVER!」を表示します。

STEP 1

HPを画面に表示しよう

HierarchyでCanvasを右クリックし、UI → Text - TextMeshProを作ります。名前をHPText、最初の文字をHP: 3に変更し、SCOREの下へ移動します。

CanvasにHPTextを追加しHP 3を設定したUnity画面
HPTextはCanvasの子にします。GameビューでもSCOREと重ならない位置にあるか確認します。
POINT|表示とHPの数字を分ける

TMP_Textは画面へ文字を出す部品です。実際のHPは、これから作るcurrentHpという変数で覚えます。

STEP 2

PlayerHealthを作ろう

PlayerHealth.csを作ります。最初に最大HP、現在のHP、表示に使うHPTextを準備します。

using UnityEngine;
using TMPro;

public class PlayerHealth : MonoBehaviour
{
    public int maxHp = 3;
    public TMP_Text hpText;

    int currentHp;

    void Start()
    {
        currentHp = maxHp;
        UpdateHpText();
    }
}

intは整数を入れる型です。maxHpは最初のHP、currentHpはゲーム中に増減するHPです。Start()で現在のHPを最大HPと同じにします。

PlayerへPlayerHealthを追加し、Hp TextへCanvas内のHPTextをドラッグします。

PlayerにPlayer Healthを追加しHPTextを設定したInspector
Max Hpは3、Hp TextにはCanvas内のHPTextが入っています。
STEP 3

ダメージでHPを減らそう

PlayerHealthクラスの中へ、HPを減らすTakeDamage()を追加します。

public void TakeDamage(int damage)
{
    if (currentHp <= 0)
    {
        return;
    }

    currentHp -= damage;

    if (currentHp < 0)
    {
        currentHp = 0;
    }

    UpdateHpText();

    if (currentHp == 0)
    {
        hpText.text = "GAME OVER!\nHP: 0";
        Debug.Log("GAME OVER");
    }
}

damageには減らす数を引数として受け取ります。-=でHPを減らし、0より小さくならないようにします。0になったらGAME OVERを表示します。

続いて、HPTextを書き換える処理を追加します。

void UpdateHpText()
{
    if (hpText != null)
    {
        hpText.text = "HP: " + currentHp;
    }
}
PlayerHealth.cs全体を確認する
using UnityEngine;
using TMPro;

public class PlayerHealth : MonoBehaviour
{
    public int maxHp = 3;
    public TMP_Text hpText;

    int currentHp;

    void Start()
    {
        currentHp = maxHp;
        UpdateHpText();
    }

    public void TakeDamage(int damage)
    {
        if (currentHp <= 0)
        {
            return;
        }

        currentHp -= damage;

        if (currentHp < 0)
        {
            currentHp = 0;
        }

        UpdateHpText();

        if (currentHp == 0)
        {
            hpText.text = "GAME OVER!\nHP: 0";
            Debug.Log("GAME OVER");
        }
    }

    void UpdateHpText()
    {
        if (hpText != null)
        {
            hpText.text = "HP: " + currentHp;
        }
    }
}
STEP 4

敵弾からTakeDamageを呼ぼう

EnemyBullet.csのOnCollisionEnterを変更します。

void OnCollisionEnter(Collision collision)
{
    if (collision.gameObject.CompareTag("Player"))
    {
        PlayerHealth playerHealth =
            collision.gameObject.GetComponent<PlayerHealth>();

        if (playerHealth != null)
        {
            playerHealth.TakeDamage(1);
        }
    }

    Destroy(gameObject);
}

敵弾がPlayerへ当たったら、そのPlayerからPlayerHealthを探します。見つかったときだけTakeDamage(1)を呼び、HPを1減らします。

敵弾に当たりHPが1まで減ったGameビュー
敵弾に当たるたびに、HPが3、2、1と減るようになりました。
敵弾に当たるとHPが3から0まで減りGAME OVERになるGameビュー
敵弾に当たるたびにHPが減り、0になるとGAME OVERへ変わる流れを確認できます。
STEP 5

GAME OVERを確認しよう

さらに敵弾へ当たり、HPを0まで減らします。画面にGAME OVERとHP 0が表示されれば成功です。

HPが0になりGAME OVERが表示されたGameビュー
HPが0になり、GAME OVERが表示されました。
MISSION

敵弾には3回当たり、壁や床に当たった弾ではHPが減らないことを確認しよう。

HPが減らないとき

PlayerのTagがPlayerになっているか、PlayerにPlayerHealthが付いているか、EnemyBullet PrefabのEnemyBulletスクリプトが更新されているかを順番に確認しよう。

CHALLENGE

HPを調整しよう

  • Max Hpを5に変え、表示と当たれる回数を確認しよう。
  • TakeDamage(1)を2に変えるとどうなるか試そう。
  • HPTextの色や大きさを変え、見やすくしよう。
次回予告

次回はGAME OVERになったら敵の攻撃やタイマーを止め、ゲームをもう一度始められるようにします。

コメント

タイトルとURLをコピーしました