生命值与伤害
本课属于 Coddy Unity 学习旅程的“物理与游戏玩法”单元。第 55 课,共 71 课。
伤害系统需要两个脚本。每个可能受到伤害的对象上都有一个 Health 脚本,由它管理对象的生命值;造成伤害的对象会找到这个脚本,并调用它的方法。下面是一个木箱的 Health 脚本,木箱受到 3 次攻击后会损坏;还有一个尖刺脚本,会伤害落在尖刺上的任何对象:
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。尖刺、子弹和熔岩都会调用同一个方法,而只有 Health 脚本会决定 0 代表什么:摧毁木箱、结束游戏,或播放死亡动画。每个脚本都存放在独立的文件中,文件名与类名相同。
对于没有 Health 的对象(例如地板),GetComponent<Health>() 会返回 null,所以尖刺会先检查,再调用方法。TryGetComponent(out Health 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);。
按下“开始”,向假人射击两次:日志会显示 Dummy hp: 2,然后假人消失。接着点击“检查”。
亲手试试
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 时销毁对象
}
}
物理与游戏玩法中的所有课
自己练习: Unity 在线编辑器