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

如何在DOTween Sequence中用Append(Tween)替代AppendCallback+AppendInterval?

问题

如何在DOTween的Sequence中使用Append(Tween)替代AppendCallback(()=> foo())?希望启动某个动画后返回一个时长等于剪辑时长的Tween,以此优化代码。

目前的实现方式是传递剪辑时长,再用公共void方法启动动画:

_sequence
    .AppendCallback(some.Foo)
    .AppendInterval(some.FooDuration)

对应的类定义如下:

class Some
{
    [SerializeField] private Animator _animator;
    [SerializeField] private AnimationClip _fooClip;
    
    public float FooDuration => _fooClip.length;

    public void Foo()
    {
        _animator.Play(_fooClip.name);
    }
}

希望优化成这样的写法:

_sequence
    .Append(some.Foo())

对应的类定义尝试了以下写法,但不想用无意义的DOTween.To:

class Some
{
    [SerializeField] private Animator _animator;
    [SerializeField] private AnimationClip _fooClip;
    
    private float _fooDuration => _fooClip.length;

    public Tween Foo()
    {
        _animator.Play(_fooClip.name);
        return DOTween.To(() => 0, (x) => x = 0, 0, _fooDuration); // 不想用这种写法
    }
}

核心疑问:Foo()方法应该返回什么?有没有特定时长的空Tween可以返回?


解决方案

直接使用DOTween官方提供的DOTween.Empty()方法,它可以创建一个指定时长的空Tween,完全满足你的需求,无需写无意义的To方法。

修改后的Some类代码如下:

class Some
{
    [SerializeField] private Animator _animator;
    [SerializeField] private AnimationClip _fooClip;
    
    private float FooDuration => _fooClip.length;

    public Tween Foo()
    {
        _animator.Play(_fooClip.name);
        // 创建空的指定时长Tween,参数为起始值、结束值、时长(这里前两个值不影响空Tween逻辑)
        return DOTween.Empty(0, 0, FooDuration);
    }
}

这样你就可以直接用_sequence.Append(some.Foo())替代原来的回调加间隔的写法,既简洁又符合DOTween的Sequence逻辑,空Tween会在指定时长后自动完成,不会产生额外性能开销。

如果需要匹配Animator的播放速度(比如动画被加速/减速),可以调整时长计算:

return DOTween.Empty(0, 0, FooDuration / _animator.speed);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 21:15:36