如何限制AI仅沿Z轴移动?冻结刚体后仍存在异常问题
解决AI仅沿Z轴移动的问题
1. 修正移动逻辑,避免随玩家跳跃上移
问题出在followPlayer方法中直接使用了玩家的完整位置,导致AI会跟随玩家的Y轴(跳跃)和X轴移动。需要固定AI自身的X、Y坐标,仅沿Z轴趋近玩家:
void followPlayer() { // 固定AI的X、Y坐标,仅使用玩家的Z轴位置作为目标 Vector3 targetPos = new Vector3(transform.position.x, transform.position.y, target.position.z); Vector3 pos = Vector3.MoveTowards(transform.position, targetPos, speed * Time.deltaTime); rig.MovePosition(pos); }
2. 修正旋转逻辑,消除不必要的转向
代码中Update方法的旋转逻辑会根据玩家的全方向位置计算转向,即使冻结了Rigidbody旋转,代码仍会强制修改旋转。可以通过两种方式解决:
方式一:完全禁止AI旋转
直接删除Update中的旋转相关代码,同时确保在Inspector面板的Rigidbody组件中勾选Freeze Rotation的X、Y、Z选项,彻底锁定旋转。
方式二:仅允许沿Z轴方向的朝向(若需要AI看向玩家Z轴方向)
修改相对位置计算,只保留Z轴分量,避免X、Y轴带来的转向:
private void Update() { StopFollowing(); // 仅计算Z轴方向的相对位移,消除X/Y轴对旋转的影响 Vector3 relativePos = new Vector3(0, 0, target.position.z - transform.position.z); // 当Z轴距离过近时跳过旋转,避免计算错误 if (relativePos.magnitude < 0.01f) return; Quaternion rotation = Quaternion.LookRotation(relativePos); Quaternion current = transform.localRotation; transform.localRotation = Quaternion.Slerp(current, rotation, Time.deltaTime * LookSpeed); }
额外检查
确保Rigidbody组件的Freeze Position选项中,X和Y轴处于勾选状态,双重保证AI不会偏离Z轴移动。
内容的提问来源于stack exchange,提问作者seemtheboy
相关产品推荐
相关产品推荐

