DOTween循环时OnComplete未执行,动画无法播放问题求助
问题:DOTween循环移动时OnComplete回调不执行、动画未播放
我编写了一段代码,用于让模型移动到指定位置后播放动画,原始代码运行正常:
using DG.Tweening; using System.Collections; using System.Collections.Generic; using UnityEngine; public class stegamove : MonoBehaviour { Animator animator; [SerializeField] private Transform _stega; void Start() { animator = GetComponent<Animator>(); _stega.DOMove(new Vector3(-2.05f, -0.56f, -3.06f), 3).SetEase(Ease.InSine).OnComplete(() => { Debug.Log("Here"); animator.Play("Armature|Stegasaurus_Stomp"); }); } // Update is called once per frame void Update() { } }
但当我添加循环逻辑,修改为以下代码后,物体直接回到初始位置,OnComplete中的回调未执行,动画也没有播放:
_stega.DOMove(new Vector3(-2.05f, -0.56f, -3.06f), 3).SetEase(Ease.InSine).OnComplete(() => { Debug.Log("Here"); animator.Play("Armature|Stegasaurus_Stomp"); }).SetLoops(-1,LoopType.Restart);
问题原因
DOTween的LoopType.Restart会在每次循环周期结束时直接重置动画到初始状态,不会触发OnComplete回调——因为该动画会无限循环,逻辑上永远不会"完成"。同时重置动作会直接将物体拉回起点,导致你看不到移动到目标点的过程,后续动画播放逻辑自然也无法执行。
解决方法
要实现「移动到目标点→播放动画→返回初始位置→重复循环」的完整流程,需要将整个动作拆分为DOTween序列(Sequence),而非直接给单个DOMove添加循环:
完整代码示例
using DG.Tweening; using UnityEngine; public class stegamove : MonoBehaviour { Animator animator; [SerializeField] private Transform _stega; private Vector3 _startPos; private Vector3 _targetPos = new Vector3(-2.05f, -0.56f, -3.06f); void Start() { animator = GetComponent<Animator>(); _startPos = _stega.position; // 创建完整循环序列 DOTween.Sequence() // 1. 移动到目标位置 .Append(_stega.DOMove(_targetPos, 3).SetEase(Ease.InSine)) // 2. 到达目标后播放动画 .AppendCallback(() => { Debug.Log("Here"); animator.Play("Armature|Stegasaurus_Stomp"); }) // 3. 等待动画播放完毕(替换为你的动画实际时长) .AppendInterval(2) // 4. 移回初始位置 .Append(_stega.DOMove(_startPos, 3).SetEase(Ease.OutSine)) // 设置无限循环 .SetLoops(-1); } void Update() { } }
额外优化建议
- 如果不需要等待动画播放完毕就返回初始位置,直接删除
.AppendInterval(2)即可。 - 可以通过代码动态获取动画时长,避免硬编码延迟:
// 在播放动画后添加这行,替换硬编码的2秒 .AppendInterval(animator.GetCurrentAnimatorStateInfo(0).length)
内容的提问来源于stack exchange,提问作者Monty Swanson
相关产品推荐
相关产品推荐

