Menu
CoddyTech

寻找目标

Coddy Unity 塔防游戏 课程的第 8 课,共 25 课。

只要敌人在塔的range范围内,塔就会攻击离它最近的敌人。为了选出目标,塔需要获取场上的所有敌人。FindObjectsByType<Enemy>会让每座塔每帧都搜索整个场景,因此我们让敌人自行维护一个列表:在 Enemy 类上创建一个静态列表,每个敌人在OnEnable中加入列表,在OnDisable中离开列表。Unity 会对即将销毁的对象调用 OnDisable,因此死亡的敌人也会离开列表。游戏中的拾取物也可以采用相同的做法:

public class Pickup : MonoBehaviour
{
    public static readonly List<Pickup> All = new List<Pickup>();

    void OnEnable()
    {
        All.Add(this);
    }

    void OnDisable()
    {
        All.Remove(this);
    }
}

查找最近的拾取物,需要用循环记住目前找到的最佳目标。一个会吸取pullRange范围内最近拾取物的磁铁,初始时没有拾取物,并把范围设为最佳距离,这样距离更远的拾取物就不可能成为目标:

Pickup best = null;
float bestDistance = pullRange;
foreach (Pickup pickup in Pickup.All)
{
    // 比目前最近的还近?记下它和它的距离。
}
Vector3.Distance(a, b)会返回两点之间的距离。如果没有拾取物在范围内,循环就不会选中任何拾取物,答案就是 null。
challenge icon

挑战

中等

每座塔都会选择射程内最近的敌人。

  1. 在 Enemy 中,添加 public static readonly List<Enemy> All = new List<Enemy>();;在 OnEnable 中添加 this,在 OnDisable 中移除它。
  2. 在 Tower 中,添加 public float range = 4f; 和 private Enemy target;。
  3. 每帧都在 Enemy.All 中查找 range 范围内最近的敌人(如果没有则为 null),当找到新的目标时,记录 "Target: " + found.name,并将它保存在 target 中。

按下 Play,然后在路径旁建造:控制台会显示每个新目标的名称。接着点击 Check。

亲手试试

using UnityEngine;

// 后续实现:防御塔找到射程内的敌人,转向敌人并开火。
public class Tower : MonoBehaviour
{
}

Unity 塔防游戏中的所有课

自己练习: Unity 在线编辑器