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

角色寻路问题排查:坐标偏差及目标Y轴异常

问题修复方案

1. 解决角色抵达后因坐标偏差无法关闭动画的问题

3D场景中用==判断坐标完全重合根本不可行——浮点运算误差、移动步长等因素会导致永远没法做到绝对一致。改用距离阈值判断:当角色与目标的距离小于一个极小值(比如0.1)时,直接判定为到达目标,关闭动画并停止移动。

修改Move脚本

// 计算角色与目标的距离
float distanceToTarget = Vector3.Distance(transform.position, Target.transform.position);
// 到达阈值,可根据场景大小调整
float arrivalThreshold = 0.1f;

if (distanceToTarget > arrivalThreshold)
{
    transform.rotation = Target.transform.rotation;
    var direction = (Target.transform.position - transform.position).normalized;
    _characterController.Move(direction * WalkSpeed * Time.deltaTime);
}
else
{
    // 抵达目标,关闭行走动画
    animator.SetBool("isWalking", false);
}

修改Target脚本的到达判断逻辑

把原有的绝对坐标相等判断替换为距离判断:

float distanceToTarget = Vector3.Distance(RelativePosition, Target.transform.position);
float arrivalThreshold = 0.1f;

if(distanceToTarget <= arrivalThreshold)
{
    animator.SetBool("isWalking", false);
    isMove = false;
}

2. 固定目标Y轴为0

每次设置目标位置时,显式将Y轴锁定为0,避免任何逻辑意外修改Y值。

修改Target脚本的位置设置代码

if (DistanceToPlayer >= MaxDistanceToPlayer)
{
    if(isMove == false)
    {
        isMove = true;
        Vector3 NewPositionToPlayer = Player.transform.position + new Vector3 (Random.Range(-5.0f, 5.0f), 0f, Random.Range(-5.0f, 5.0f));
        // 强制锁定Y轴为0
        NewPositionToPlayer.y = 0f;
        Target.transform.position = NewPositionToPlayer;
        
        animator.SetBool("isWalking", true);
    }
}

如果担心其他操作会偷偷修改目标Y轴,可在Target脚本中添加兜底逻辑:

void LateUpdate()
{
    // 确保目标Y轴始终保持为0
    Vector3 fixedPos = Target.transform.position;
    fixedPos.y = 0f;
    Target.transform.position = fixedPos;
}

内容的提问来源于stack exchange,提问作者Alexey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 23:18:42