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

Unity 3D角色旋转异常:按下WASD后角色大幅转圈问题

问题分析与修复方案

问题根源

  1. targetRotation未初始化:初始状态下targetRotation默认值为Quaternion.identity,与角色初始旋转角度不一致,无输入时角色会自动向identity方向旋转,此时按下按键切换目标旋转角度,就会触发大幅转圈的异常。
  2. moveDir可能包含垂直分量:如果cameraController.PlanarRotation不是仅绕Y轴的旋转,计算出的moveDir会带有Y轴数值,Quaternion.LookRotation会让角色产生俯仰旋转,进而引发异常转圈行为。

修复步骤

1. 初始化目标旋转

在Awake方法中,将targetRotation初始化为角色当前的旋转角度,避免初始状态下的无意义旋转:

private void Awake()
{
    cameraController = Camera.main.GetComponent<CameraController>();
    targetRotation = transform.rotation; // 初始化目标旋转为角色当前朝向
}

2. 确保移动方向处于水平平面

对计算后的moveDir进行Y轴归零处理,保证角色仅在水平面上调整朝向:

var moveDir = cameraController.PlanarRotation * moveInput;
moveDir.y = 0; // 移除垂直分量,锁定水平方向
moveDir = moveDir.normalized; // 重新归一化,避免Y轴归零后向量长度异常

3. 优化输入停止后的行为(可选)

如果希望停止输入时角色保持当前朝向,而非继续转向最后一次输入的方向,可在输入停止时更新targetRotation为当前旋转角度:

if(moveAmount > 0)
{
    transform.position += moveDir * moveSpeed * Time.deltaTime;
    targetRotation = Quaternion.LookRotation(moveDir);
}
else
{
    targetRotation = transform.rotation; // 停止输入时保持当前朝向
}

完整修复后代码

[SerializeField] float moveSpeed = 5f;
[SerializeField] float rotationSpeed = 500f;

Quaternion targetRotation;
CameraController cameraController;

private void Awake()
{
    cameraController = Camera.main.GetComponent<CameraController>();
    targetRotation = transform.rotation;
}

private void Update()
{
    float h = Input.GetAxis("Horizontal");
    float v = Input.GetAxis("Vertical");

    float moveAmount = Mathf.Abs(h) + Mathf.Abs(v);
    var moveInput = new Vector3(h, 0, v).normalized;

    var moveDir = cameraController.PlanarRotation * moveInput;
    moveDir.y = 0;
    moveDir = moveDir.normalized;

    if(moveAmount > 0)
    {
        transform.position += moveDir * moveSpeed * Time.deltaTime;
        targetRotation = Quaternion.LookRotation(moveDir);
    }
    else
    {
        targetRotation = transform.rotation;
    }

    transform.rotation = Quaternion.RotateTowards(transform.rotation, targetRotation, rotationSpeed * Time.deltaTime);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 09:07:35