You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 05:33:25