如何用NavMesh实现敌人指定激活范围的向玩家移动及代码排查
敌人激活范围追踪问题解决方案
核心问题排查与修复
你的代码逻辑方向是对的,但可能因为以下几个新手易犯的问题,导致dis或distVal未被正确识别:
1. 变量作用域与可调试性优化
将固定范围值distVal从Update方法内移到类的公共字段,这样不仅能避免每帧重复初始化,还能在Unity Inspector面板直接调整数值,方便调试:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.AI; public class Follow : MonoBehaviour { public NavMeshAgent enemy; public Transform Player; // 公共字段,可在Unity面板直接修改范围值 public float distVal = 5.0f; void Update() { // 用transform.position确保获取的是敌人的世界位置 float dis = Vector3.Distance(enemy.transform.position, Player.position); if (dis <= distVal) { enemy.SetDestination(Player.position); } // 补充:玩家超出范围时,让敌人停止移动 else { enemy.SetDestination(enemy.transform.position); } } }
2. 组件引用未赋值
这是新手最常忽略的点:在Unity编辑器中,选中挂载Follow脚本的敌人对象,在Inspector面板的Follow组件下,必须完成两个赋值:
- 将敌人自身的
NavMeshAgent组件拖拽到enemy字段 - 将玩家对象拖拽到
Player字段
如果未赋值,代码中的enemy或Player会为空,导致距离计算失败。
3. 位置计算的准确性
原代码中使用enemy.position,更稳妥的写法是enemy.transform.position,确保获取的是敌人的世界空间位置,避免因导航代理的偏移导致距离计算错误。
额外调试优化
可以添加可视化范围线框,方便在编辑器中直观看到激活范围:
// 在Follow类中添加这个方法 void OnDrawGizmosSelected() { if (enemy != null) { Gizmos.color = Color.yellow; // 绘制黄色线框球体,代表激活范围 Gizmos.DrawWireSphere(enemy.transform.position, distVal); } }
选中敌人对象时,场景窗口会显示对应范围的线框,调试更直观。
内容的提问来源于stack exchange,提问作者Mackenzie Digital Design
相关产品推荐
相关产品推荐

