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

LeanTween旋转至180/-180度时动画卡顿问题求助

问题分析与解决方案

卡顿原因

核心问题出在欧拉角的歧义性与LeanTween的默认行为:

  • Unity中180°和-180°的X轴旋转是完全相同的姿态,LeanTween默认会选择最短旋转路径插值。当目标角度接近这个临界值时,LeanTween可能突然切换旋转方向(比如从顺时针转变成逆时针),导致视觉上的卡顿跳变。
  • 直接设置绝对目标角度时,LeanTween无法感知你期望的旋转方向(顺时针/逆时针),只能自行计算最短路径,这就会在临界角度时出现异常。

解决方案:使用增量旋转替代绝对目标角度

放弃记录绝对欧拉角,改为让LeanTween执行增量旋转(每次±90°),强制动画沿着你期望的方向进行,彻底避免欧拉角歧义带来的问题。

修改后的代码:

using System.Collections;
using UnityEngine;

public class RotateScript360 : MonoBehaviour
{
    public GameObject level;
    public AudioSource audioSource;
    public AudioClip rotateSound;
    private bool cooldown;

    void Update()
    {
        if (!cooldown)
        {
            if (Input.GetKeyDown(KeyCode.X) || Input.GetButtonDown("X"))
            {
                // 顺时针旋转90°
                TriggerRotation(-90f);
            }
            else if (Input.GetKeyDown(KeyCode.Z) || Input.GetButtonDown("Z"))
            {
                // 逆时针旋转90°
                TriggerRotation(90f);
            }
        }
    }

    void TriggerRotation(float angleDelta)
    {
        audioSource.PlayOneShot(rotateSound);
        // 关键:设置relative=true,让LeanTween基于当前角度累加旋转增量
        LeanTween.rotate(level, new Vector3(angleDelta, 0, 0), 1f)
            .setEaseOutExpo()
            .setRelative(true);
        cooldown = true;
        StartCoroutine(CooldownRoutine());
    }

    IEnumerator CooldownRoutine()
    {
        yield return new WaitForSeconds(1f);
        cooldown = false;
    }
}

额外优化说明

  1. 移除绝对角度记录:不再依赖rotation变量跟踪目标欧拉角,转而通过增量旋转直接控制方向,从根源避免欧拉角歧义。
  2. 修正输入检测:用Input.GetButtonDown替代Input.GetButton,确保按下一次仅触发一次旋转;同时使用KeyCode.X而非字符串"x",提升代码安全性与性能。
  3. 协程优化:将协程从Update方法中移出,避免每帧重复定义协程的不良编码习惯。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 09:43:23