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完成后不会被自动销毁,可以通过RestartPlay等函数再次使用。

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
 
游戏GC优化(1)-C#闭包函数的原理Unity3D和C#开发注意和优化技巧合集1
Loading...
有理fan
有理fan
只讲干货的干饭游戏人🍚
Latest posts
好用软件分享
2024-9-30
Unity开发中的一些坑点集合
2024-8-15
获取AnimationClip中的欧拉角旋转曲线
2024-8-15
Unity3D好用插件分享
2023-12-25
Unity中DOTween生命周期管理
2023-12-12
Unity3D和C#开发注意和优化技巧合集1
2023-11-20
Announcement
-- 感谢来看 ---
QQ: 821869798