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

检测到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 22:17:42