Unity 3D角色旋转异常:按下WASD后角色大幅转圈问题
问题分析与修复方案
问题根源
targetRotation未初始化:初始状态下targetRotation默认值为Quaternion.identity,与角色初始旋转角度不一致,无输入时角色会自动向identity方向旋转,此时按下按键切换目标旋转角度,就会触发大幅转圈的异常。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
相关产品推荐
相关产品推荐

