体力とダメージ
CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 53/63。
ダメージ処理には2つのスクリプトを使います。ダメージを受けるものすべてにHealthスクリプトを付けてヒットポイントを管理し、ダメージを与える側はそのスクリプトを見つけてメソッドを呼び出します。以下は、3回攻撃を受けると壊れる木箱のHealthと、その上に着地したものにダメージを与えるトゲの例です。
public class Health : MonoBehaviour
{
[SerializeField] private int hp = 3;
public void TakeDamage(int amount)
{
hp -= amount;
if (hp <= 0)
{
Destroy(gameObject);
}
}
}public class Spikes : MonoBehaviour
{
void OnCollisionEnter(Collision collision)
{
Health health = collision.gameObject.GetComponent<Health>();
if (health != null)
{
health.TakeDamage(1);
}
}
}TakeDamageはpublicなので、ほかのスクリプトから呼び出せます。また、hpを変更するコードはこれだけです。トゲ、弾丸、溶岩はすべて同じメソッドを呼び出し、0になったときの処理(木箱を破壊する、ゲームを終了する、死亡アニメーションを再生する)はHealthスクリプトだけが決定します。各スクリプトはそれぞれ独立したファイルにあり、クラス名と同じ名前が付いています。
GetComponent<Health>()は、床のようにHealthを持たないものに対してnullを返すので、トゲは呼び出す前にチェックします。TryGetComponent(out Health health)は、検索とチェックを1回の呼び出しで行います。Healthがある場合にだけtrueを返し、healthに値を設定します。
チャレンジ
中級訓練用の銃が、ダミーと装甲を着た騎士を撃ちます。銃に付いている Shooter スクリプトは準備済みです。左右の矢印キーで銃が回転し、Space キーで弾丸を発射します。命中を処理する2つのスクリプトを書きましょう。
ダミーと騎士に付ける Health(Inspector で hp と armor を設定します):
- パブリックメソッド
TakeDamage(int amount):hpをamountからarmorを引いた分だけ減らします。ただし、減少量は最低でも1です。 - 命中するたびに、オブジェクトの名前と残りhpを
Dummy hp: 2のようにログに記録します。 - hpが0以下になったら、オブジェクトを破棄します。
各弾丸に付ける Bullet(Inspector で damage を2に設定します):
- Health を持つものに弾丸が命中したら、その
TakeDamage(damage)を呼び出します。 - 壁も含め、何に命中しても弾丸を破棄します。
Play を押して、ダミーと騎士を倒してから、Check を押してください。
自分で試してみよう
using UnityEngine;
public class Health : MonoBehaviour
{
[SerializeField] private int hp = 4;
[SerializeField] private int armor = 0;
public void TakeDamage(int amount)
{
// amount から armor を引いた値(最低 1)だけ減らし、残りをログに記録し、0 になったら破棄する
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。