如何让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
相关产品推荐
相关产品推荐

