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

如何阻止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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 08:17:13