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

Unity中Mathf.LerpAngle导致360度旋转异常问题求助

问题根源分析

你的代码里有几个关键错误导致了异常旋转:

  1. 混淆四元数与欧拉角:transform.rotation.x是四元数的分量(范围[-1,1]),而Mathf.LerpAngle需要的是角度值(如0-360°),类型完全不匹配,直接导致Lerp计算逻辑错误。
  2. 目标角度设置错误:input.y是输入轴的原始值(范围[-1,0,1]),直接把它作为目标角度传入,数值太小且不符合旋转需求,应该映射到你需要的倾斜角度范围(比如±15°)。
  3. 旋转方式错误:transform.Rotate()是累加旋转逻辑,而Mathf.LerpAngle计算出的是目标角度而非旋转增量,累加操作会导致角度不断叠加,最终出现360°循环旋转。
  4. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 23:46:15