Unity中Mathf.LerpAngle导致360度旋转异常问题求助
问题根源分析
你的代码里有几个关键错误导致了异常旋转:
- 混淆四元数与欧拉角:
transform.rotation.x是四元数的分量(范围[-1,1]),而Mathf.LerpAngle需要的是角度值(如0-360°),类型完全不匹配,直接导致Lerp计算逻辑错误。 - 目标角度设置错误:
input.y是输入轴的原始值(范围[-1,0,1]),直接把它作为目标角度传入,数值太小且不符合旋转需求,应该映射到你需要的倾斜角度范围(比如±15°)。 - 旋转方式错误:
transform.Rotate()是累加旋转逻辑,而Mathf.LerpAngle计算出的是目标角度而非旋转增量,累加操作会导致角度不断叠加,最终出现360°循环旋转。 - Flip方法的不稳定性:用
transform.Rotate(0,180,0)累加Y轴旋转,多次翻转后可能导致欧拉角出现异常值,干扰后续角度计算。
修复方案
以下是修正后的完整代码,附带注释说明:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.InputSystem; public class PlayerController : MonoBehaviour { public InputAction MoveAction; private Vector2 input; [SerializeField] float speed; [SerializeField] float rotateSpeed; [SerializeField] float maxTiltAngle = 15f; // 上下旋转的最大幅度,可按需调整 private bool facingRight = true; private float inputH; void Start() { MoveAction.Enable(); } void Update() { Vector2 move = MoveAction.ReadValue<Vector2>(); Vector2 position = (Vector2)transform.position + move * speed * Time.deltaTime; inputH = Input.GetAxis("Horizontal"); input.y = Input.GetAxisRaw("Vertical"); // 计算上下旋转的目标角度:将输入值映射到设定的角度范围 float targetAngle = input.y * maxTiltAngle; // 获取当前角色X轴的欧拉角(用localEulerAngles避免世界空间干扰) float currentAngle = transform.localEulerAngles.x; // 用LerpAngle计算最短路径的目标角度 float newAngle = Mathf.LerpAngle(currentAngle, targetAngle, Time.deltaTime * rotateSpeed); // 直接设置欧拉角,替代累加旋转,确保角度计算准确 transform.localEulerAngles = new Vector3(newAngle, transform.localEulerAngles.y, transform.localEulerAngles.z); transform.position = position; } void FixedUpdate() { if(inputH > 0 && !facingRight) Flip(); else if(inputH < 0 && facingRight) Flip(); } void Flip() { facingRight = !facingRight; // 直接设置Y轴欧拉角,比Rotate更稳定,避免多次翻转后的角度异常 Vector3 currentEuler = transform.localEulerAngles; currentEuler.y = facingRight ? 0f : 180f; transform.localEulerAngles = currentEuler; } }
关键修改点
- 新增
maxTiltAngle参数,灵活控制角色上下倾斜的幅度 - 用
transform.localEulerAngles.x获取正确的欧拉角角度值,替代错误的四元数分量 - 将
input.y映射到合理的目标角度范围,不再直接传入LerpAngle - 直接设置
localEulerAngles而非用Rotate()累加旋转,避免角度叠加错误 - 重构Flip方法为直接设置Y轴欧拉角,消除多次翻转后的角度异常
内容的提问来源于stack exchange,提问作者meow
相关产品推荐
相关产品推荐

