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

