溅射
Coddy Unity 塔防游戏 课程的第 20 课,共 25 课。
Cannon 的炮弹会在落点爆炸,对爆炸范围内的所有敌人造成伤害,而不只是攻击目标。Physics.OverlapSphere(center, radius)会返回距离center不超过radius的所有碰撞体:敌人、地面和路径也包括在内。每个带有 IDamageable 的碰撞体都会受到伤害。目标也在其中,因为炮弹会落在目标身上,所以不能再单独对它造成第二次伤害。下面是一个会击退周围所有板条箱的炸弹:
void Explode()
{
foreach (Collider other in Physics.OverlapSphere(transform.position, blastRadius))
{
if (other.TryGetComponent(out Rigidbody body))
{
Vector3 away = (body.position - transform.position).normalized;
body.AddForce(away * push, ForceMode.Impulse);
}
}
}溅射半径是 Cannon 的数据,因此现在投射物需要的不只是伤害数值:Launch还要接收防御塔的 TowerData。Arrow 的溅射半径为 0,因此它发射的箭仍然只会击中目标。伤害值仍作为单独的参数传入,因为它取决于防御塔的等级。
爆炸效果会让玩家看到炮弹爆炸的位置:一个半透明球体,宽度等于溅射范围,并在四分之一秒后消失。Destroy(blast, 0.25f)会在延迟后销毁它,不需要你自己设置计时器。
挑战
中等加农炮炮弹爆炸,会伤害附近的每个敌人。
- 在
TowerData中添加public float splashRadius;(CannonData 将其设为 1.5)。Launch接收第三个参数TowerData data,并由 Tower 传入。 - 到达时,如果
data.splashRadius > 0,则Physics.OverlapSphere(transform.position, data.splashRadius)中的每个 IDamageable 都会受到一次伤害;否则,只有目标会受到伤害。 - 然后,在那里显示序列化的
blastPrefab,将其缩放为Vector3.one * data.splashRadius * 2f,并调用Destroy(blast, 0.25f)。
按“开始”:加农炮的爆炸会伤害聚集在一起的 Grunt。然后点击“检查”。
亲手试试
using UnityEngine;
public class Projectile : MonoBehaviour
{
[SerializeField] private float speed = 12f;
private Transform target;
private int damage;
public void Launch(Transform target, int damage)
{
this.target = target;
this.damage = damage;
}
void Update()
{
if (target == null)
{
Destroy(gameObject);
return;
}
transform.position = Vector3.MoveTowards(transform.position, target.position, speed * Time.deltaTime);
if (transform.position == target.position)
{
if (target.TryGetComponent(out IDamageable damageable))
{
damageable.TakeDamage(damage);
}
Destroy(gameObject);
}
}
}
Unity 塔防游戏中的所有课
自己练习: Unity 在线编辑器