Unity2D敌人巡逻脚本异常:速度忽慢忽快且来回弹跳求助
敌人两点巡逻脚本问题修复方案
问题根源分析
- 浮点数精度误差:直接使用
transform.position == 目标点.position进行位置判断,由于Unity中3D位置的浮点数计算存在精度误差,敌人很难完全精确命中目标点,反而会在目标点附近反复触发切换逻辑,导致来回弹跳。 - 速度未绑定时间步长:原代码中
PatrolSpeed未乘以Time.fixedDeltaTime,FixedUpdate的执行间隔是固定的(默认0.02秒),这会导致移动速度受帧率影响,且接近目标时单次移动距离可能超过剩余距离,触发反向移动后立刻又触发切换,出现“加速弹跳”的异常。
修复方案及代码
以下是修复后的完整脚本,同时优化了逻辑可读性:
// 可在Inspector面板调整的参数 public float PatrolSpeed = 2f; // 到达判定阈值:距离目标点小于此值时视为到达 public float arrivalThreshold = 0.1f; public Transform PointA; public Transform PointB; private bool switching = false; private bool PlayerInRange = false; private void FixedUpdate() { // 玩家在范围内时跳过巡逻逻辑(可在此添加追击逻辑) if (PlayerInRange) return; // 确定当前巡逻目标点 Vector3 targetPos = switching ? PointB.position : PointA.position; // 计算本次FixedUpdate的移动距离,绑定时间步长保证速度稳定 float moveStep = PatrolSpeed * Time.fixedDeltaTime; transform.position = Vector3.MoveTowards(transform.position, targetPos, moveStep); // 用距离阈值判断是否到达目标点,避免浮点数精度问题 float distanceToTarget = Vector3.Distance(transform.position, targetPos); if (distanceToTarget <= arrivalThreshold) { // 切换巡逻目标 switching = !switching; } }
关键修改说明
- 距离阈值判定:使用
Vector3.Distance计算当前位置与目标点的距离,和自定义的arrivalThreshold比较,彻底避免浮点数精度导致的误判。你可以根据敌人的模型大小调整阈值,比如模型半径0.5的话,设为0.1~0.3都合适。 - 时间步长绑定:
PatrolSpeed * Time.fixedDeltaTime确保敌人每秒移动的距离严格等于PatrolSpeed的设定值,不管FixedUpdate的执行频率如何,移动速度始终稳定。 - 逻辑简化:先判断
PlayerInRange,为真时直接跳过巡逻逻辑,避免重复的条件判断,让代码结构更清晰。
内容的提问来源于stack exchange,提问作者hristoToDo
相关产品推荐
相关产品推荐

