type
status
date
slug
summary
tags
category
icon
password
在Unity中需要使用DOTween来做补间动画,经常有创建Tween和Sequence的操作,但是麻烦在于需要考虑Tween的销毁和中断问题,以下介绍方便管理Tween的手段,不需要手动去记录创建出来的Tween和Sequence对象,减少代码量,增加开发效率。
文章原创,转载需标明出处
📝 常用函数介绍
SetAutoKill
这个函数用于设置是否在Tween动画结束后自动销毁(kill)Tween对象。默认值为true,表示当Tween完成后会自动被销毁,以释放资源。如果设置为false,Tween完成后不会被自动销毁,可以通过Restart
、Play
等函数再次使用。
SetLink
这个函数用于设置Tween对象与一个Unity GameObject的关联关系。比如当GameObject被禁用或者销毁时,关联的Tween对象也会被相应地暂停或者销毁。
SetTaget
在DoTween中主要用于给Tween设置一个标识,这个标识可以是任何对象类型,包括GameObject。SetTarget
的主要用途是方便你在之后的代码中通过这个标识来找到、操作或销毁这个Tween。例如,你可以使用DOTween.Kill(target)
或者target.DOKill()
来销毁所有设置了相同标识的Tween。 但是请注意该接口原理是遍历所有Tween进行筛选,所以最好不要出现在频繁调用的地方,如Update里。
🤗 常见使用场景
使用场景1:一次动画
提供一个播放一次动画的方法,如果上次动画在播放中,需要Kill掉之前没播完的动画,GameObject销毁的时候也会自动销毁。
Tween
Sequence
使用场景2:多次动画
提供两个方法,一个方法创建Tween和Sequence,不会自动销毁;另一个方法用来重复播放。GameObject销毁的时候也会自动销毁。
Tween
Sequence
🖥️ 结合UniTask使用
要让DoTween支持UniTask,需要安装UniTask,以及添加宏UNITASK_DOTWEEN_SUPPORT
以下展示Tween的方式,Sequence同理,也可以await,Sequence是Tween的派生类。
看看下列代码,如果调用
Start
函数结果是什么当调用Start函数的时候,会直接调用两次PlayTweenAsync,但是由于第二次调用DOKill之后会让DOTwen的状态是Kill,而通过AwaitForComplete只匹配正常Complete状态,这样await之后的代码就不会执行。所以最终的结果是只会打印一次Play Complete。
UniTask番外小知识
在使用UniTask的AutoResetUniTaskCompletionSource这类自定义的async await的时候,同样的也可以让await之后的代码在取消的时候不执行。
await的原理:
使用await
关键字时,编译器会将该方法拆分为两部分:await
之前的部分和await
之后的部分。这两部分实际上是在两个不同的时间点执行的。首先,执行await
之前的部分,然后当遇到await
关键字时,当前方法会被暂停,并返回一个未完成的任务。这个任务会在异步操作完成后恢复执行方法的剩余部分。如果任务被取消(比如通过TrySetCanceled
方法),那么剩余的部分(即await
之后的部分)将不会执行,因为await
关键字会抛出一个OperationCanceledException
异常。这是因为.NET
的任务取消模型是通过抛OperationCanceledException
异常来表示任务已被取消。
例如下列代码:
调用
Start
之后是没有任何日志的,如果换成调用TrySetResult
就会正常打印出TestCustomAsync Complete
。- Author:有理fan
- URL:https://unifan.top/article/dotween_life
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!