检测到Swipe.Left时,如何在if语句中实现物体平滑旋转90度?
解决Unity中滑动触发物体平滑旋转90度的问题
嘿,我明白你的困扰——之前的代码之所以没效果,是因为你只在检测到滑动的那一帧执行了一次Slerp插值,这根本来不及产生平滑的旋转动画!平滑插值需要在每一帧持续更新,直到旋转完成才行。下面给你一个可行的原生Unity解决方案:
步骤1:定义状态变量
首先需要几个变量来跟踪旋转的状态,避免重复触发,同时记录目标旋转角度:
private Quaternion _targetRotation; private bool _isRotating = false; public float rotationSpeed = 2f; // 可以调整这个值来控制旋转快慢
步骤2:触发旋转逻辑
当检测到Swipe.Left时,计算目标旋转并开启旋转状态:
// 假设你的滑动检测逻辑在这里 if (Swipe.Left && !_isRotating) { // 计算目标旋转:当前旋转基础上,绕Vector3.down轴转90度 _targetRotation = transform.rotation * Quaternion.AngleAxis(90f, Vector3.down); _isRotating = true; }
步骤3:逐帧更新平滑旋转
在Update方法里持续处理旋转,直到完成:
void Update() { if (_isRotating) { // 使用Slerp进行球面插值,Time.deltaTime保证旋转速度不受帧率影响 transform.rotation = Quaternion.Slerp(transform.rotation, _targetRotation, rotationSpeed * Time.deltaTime); // 检查是否已经接近目标旋转(避免因插值精度问题一直旋转) if (Quaternion.Angle(transform.rotation, _targetRotation) < 0.1f) { // 直接设置到目标旋转,消除微小误差 transform.rotation = _targetRotation; _isRotating = false; } } }
关键注意点
- 必须在Update中持续执行插值:单次的Slerp只会让物体旋转一点点,完全看不出平滑效果,只有逐帧更新才能形成连贯动画。
- 用布尔值锁死旋转状态:
_isRotating可以防止在旋转过程中再次响应滑动,避免旋转混乱。 - 用Time.deltaTime适配帧率:保证在不同性能的设备上,旋转速度是一致的。
如果你不想自己写逻辑,也可以用LeanTween、DOTween这类动画插件,一行代码就能搞定平滑旋转,但上面的原生方法已经足够稳定好用啦!
内容的提问来源于stack exchange,提问作者user13143185
相关产品推荐
相关产品推荐

