Menu
CoddyTech

溅射

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)会在延迟后销毁它,不需要你自己设置计时器。

challenge icon

挑战

中等

加农炮炮弹爆炸,会伤害附近的每个敌人。

  1. 在 TowerData 中添加 public float splashRadius;(CannonData 将其设为 1.5)。Launch 接收第三个参数 TowerData data,并由 Tower 传入。
  2. 到达时,如果 data.splashRadius > 0,则 Physics.OverlapSphere(transform.position, data.splashRadius) 中的每个 IDamageable 都会受到一次伤害;否则,只有目标会受到伤害。
  3. 然后,在那里显示序列化的 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 在线编辑器