如何阻止Unity内置Character Controller绕X或Z轴旋转?
解决Character Controller朝向目标时倾斜/平躺的问题
问题根源在于Quaternion.LookRotation会让角色完全匹配目标的三维方向(包括上下俯仰),但Character Controller需要保持垂直站立状态,仅在水平面上转向目标。
核心解决方案:仅保留Y轴旋转,固定X、Z轴旋转
修改代码时忽略目标与角色的高度差,只计算水平方向的朝向,同时强制角色的X、Z轴旋转为0,确保始终垂直站立:
public class LookAt : MonoBehaviour { public Transform lookAtOpponent; void Update() { // 计算水平方向的相对位置,剔除Y轴高度差 Vector3 relativePosition = lookAtOpponent.position - transform.position; relativePosition.y = 0; // 避免角色与目标重合时出现旋转异常 if (relativePosition.magnitude < 0.01f) return; // 生成仅绕Y轴的目标旋转 Quaternion targetRotation = Quaternion.LookRotation(relativePosition, Vector3.up); // 固定X、Z轴旋转值,只保留Y轴转向 targetRotation.eulerAngles = new Vector3(0, targetRotation.eulerAngles.y, 0); transform.rotation = targetRotation; } }
更轻量化的写法(直接计算Y轴角度)
如果不需要复杂的旋转过渡,也可以直接计算目标的Y轴转向角度:
public class LookAt : MonoBehaviour { public Transform lookAtOpponent; void Update() { Vector3 relativePosition = lookAtOpponent.position - transform.position; relativePosition.y = 0; if (relativePosition.magnitude < 0.01f) return; // 直接获取目标方向对应的Y轴角度 float targetYAngle = Quaternion.LookRotation(relativePosition).eulerAngles.y; // 强制角色仅在Y轴转向 transform.rotation = Quaternion.Euler(0, targetYAngle, 0); } }
可选优化:平滑转向
如果需要让角色转向更自然,可使用Quaternion.Lerp添加平滑过渡效果,调整最后一个数值控制转向速度:
transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, Time.deltaTime * 5f);
内容的提问来源于stack exchange,提问作者Wurdular
相关产品推荐
相关产品推荐

