体力とダメージ
CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 55/71。
ダメージ処理には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に値を設定します。
チャレンジ
中級命中を無駄にしないようにしましょう。Bulletは準備できており、命中した対象にTakeDamage(2)を呼び出します。
Healthで、TakeDamage(int amount)を完成させます。hpからMathf.Max(amount - armor, 1)を引きます。name + " hp: " + hpをログに出力します。例:Dummy hp: 2。hp <= 0のとき、Destroy(gameObject);を呼び出します。
「プレイ」を押してダミーを2回撃ちます。ログにDummy hp: 2と表示された後、ダミーが消えます。その後、「確認」を押します。
自分で試してみよう
using UnityEngine;
public class Health : MonoBehaviour
{
[SerializeField] private int hp = 4;
[SerializeField] private int armor = 0;
public void TakeDamage(int amount)
{
// armor を差し引いた amount(最低 1)だけ hp を減らし、残りをログに記録して、0 になったら破棄する
}
}
物理演算とゲームプレイのすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド