寻找目标
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。挑战
中等每座塔都会选择射程内最近的敌人。
- 在
Enemy中,添加public static readonly List<Enemy> All = new List<Enemy>();;在OnEnable中添加this,在OnDisable中移除它。 - 在
Tower中,添加public float range = 4f;和private Enemy target;。 - 每帧都在
Enemy.All中查找range范围内最近的敌人(如果没有则为 null),当找到新的目标时,记录"Target: " + found.name,并将它保存在target中。
按下 Play,然后在路径旁建造:控制台会显示每个新目标的名称。接着点击 Check。
亲手试试
using UnityEngine;
// 后续实现:防御塔找到射程内的敌人,转向敌人并开火。
public class Tower : MonoBehaviour
{
}
Unity 塔防游戏中的所有课
自己练习: Unity 在线编辑器