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

如何让DOTween在已有补间运行时启动同对象新补间

解决DOTween补间融合执行问题

首先修复原代码中的数组越界问题:将协程中的if (currentNum <= cameraSettings.camerasProperties.Length)改为if (currentNum < cameraSettings.camerasProperties.Length),否则当currentNum等于数组长度时,访问camerasProperties[currentNum]会抛出索引越界异常。

针对“已有补间运行时启动新补间并融合执行”的需求,分两种场景处理:

场景1:新补间从当前状态平滑过渡到目标(替换旧补间)

这是DOTween的默认行为,当你对同一个Transform属性(如位置、旋转)启动新补间时,旧补间会被自动终止,新补间会从当前的属性状态开始插值到目标值,天然实现平滑融合。

你原代码中的移动和旋转补间已经符合这个逻辑,若希望上一个补间完成后再启动下一个,可在协程中等待当前补间完成:

IEnumerator DoCameraStuff()
{
    while (currentNum < cameraSettings.camerasProperties.Length)
    {
        CamerasProperties cameraProp = cameraSettings.camerasProperties[currentNum];
        yield return new WaitForSeconds(cameraProp.pauseBefore);

        // 创建移动和旋转补间,并等待它们完成
        var moveTween = cameraToMove.transform.DOMove(cameraProp.Camera.transform.position, cameraProp.timeToTravel)
            .SetEase(cameraProp.easeType);
        var rotateTween = cameraToMove.transform.DORotateQuaternion(cameraProp.Camera.transform.rotation, cameraProp.timeToTravel)
            .SetEase(cameraProp.easeType);

        // 等待两个补间都完成
        yield return moveTween.WaitForCompletion();
        yield return rotateTween.WaitForCompletion();

        currentNum++;
    }
}

场景2:新补间与旧补间叠加效果(同时作用)

如果希望旧补间继续运行,新补间的效果叠加在旧补间上(比如两个移动补间同时驱动相机位置),需要使用DOTween.To手动实现插值,而非DOMove/DORotate这类直接设置属性的方法(后者会覆盖旧补间效果):

// 替换DOMove为手动插值,实现叠加效果
DOTween.To(() => cameraToMove.transform.position, 
           pos => cameraToMove.transform.position = pos, 
           cameraProp.Camera.transform.position, 
           cameraProp.timeToTravel)
    .SetEase(cameraProp.easeType)
    .SetUpdate(UpdateType.Normal, true); // 允许同一帧内叠加多个补间的更新

// 旋转同理
DOTween.To(() => cameraToMove.transform.rotation, 
           rot => cameraToMove.transform.rotation = rot, 
           cameraProp.Camera.transform.rotation, 
           cameraProp.timeToTravel)
    .SetEase(cameraProp.easeType)
    .SetUpdate(UpdateType.Normal, true);

这种方式下,多个补间会同时修改相机的位置/旋转,最终效果为所有补间的插值结果叠加。

另外,若你之前尝试Sequence未生效,Sequence用于按顺序或并行执行一组补间,若想让移动和旋转补间并行启动,写法如下:

var sequence = DOTween.Sequence();
sequence.Join(cameraToMove.transform.DOMove(cameraProp.Camera.transform.position, cameraProp.timeToTravel)
        .SetEase(cameraProp.easeType));
sequence.Join(cameraToMove.transform.DORotateQuaternion(cameraProp.Camera.transform.rotation, cameraProp.timeToTravel)
        .SetEase(cameraProp.easeType));
sequence.Play();

用Join方法可让多个补间同时启动,Append则是按顺序执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 20:56:03