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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 05:25:16