角色寻路问题排查:坐标偏差及目标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
相关产品推荐
相关产品推荐

