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; } }
额外优化说明
- 移除绝对角度记录:不再依赖
rotation变量跟踪目标欧拉角,转而通过增量旋转直接控制方向,从根源避免欧拉角歧义。 - 修正输入检测:用
Input.GetButtonDown替代Input.GetButton,确保按下一次仅触发一次旋转;同时使用KeyCode.X而非字符串"x",提升代码安全性与性能。 - 协程优化:将协程从Update方法中移出,避免每帧重复定义协程的不良编码习惯。
内容的提问来源于stack exchange,提问作者Provo
相关产品推荐
相关产品推荐

