第5回ではPlayerにHPを追加します。敵弾に当たるたびにHPを1減らし、0になったら画面へ「GAME OVER!」を表示します。
HPを画面に表示しよう
HierarchyでCanvasを右クリックし、UI → Text - TextMeshProを作ります。名前をHPText、最初の文字をHP: 3に変更し、SCOREの下へ移動します。
TMP_Textは画面へ文字を出す部品です。実際のHPは、これから作るcurrentHpという変数で覚えます。
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をドラッグします。
ダメージで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;
}
}
}
敵弾から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減らします。
GAME OVERを確認しよう
さらに敵弾へ当たり、HPを0まで減らします。画面にGAME OVERとHP 0が表示されれば成功です。
敵弾には3回当たり、壁や床に当たった弾ではHPが減らないことを確認しよう。
HPが減らないとき
PlayerのTagがPlayerになっているか、PlayerにPlayerHealthが付いているか、EnemyBullet PrefabのEnemyBulletスクリプトが更新されているかを順番に確認しよう。
HPを調整しよう
- Max Hpを5に変え、表示と当たれる回数を確認しよう。
TakeDamage(1)を2に変えるとどうなるか試そう。- HPTextの色や大きさを変え、見やすくしよう。
次回はGAME OVERになったら敵の攻撃やタイマーを止め、ゲームをもう一度始められるようにします。


コメント