元某人也元某人也

DoTween 学习笔记

补间动画的核心 API:移动、旋转、缩放、序列,以及高阶用法。

本文目录

一、简介

DOTween 是一个高效且功能强大的 Unity 动画和时间控制库,广泛用于游戏开发中。主要定位可以是Lerp插值的上位替代

主要用于简化和优化在unity中创建和管理动画的过程,几个特点:

  • 简单易用: 其提供了直观的 API,使得动画的创建和控制变得简单。我们可以通过链式调用来设置动画属性。
  • 高性能: 相较于其他的库来说,它是一个轻量级的库,优化了性能,适合在游戏中频繁使用。
  • 类型多样: 出了支持最常用的位置、旋转、缩放、颜色、透明度等,它还支持对 UI 元素的动画。
  • 时间控制: 其封装的API允许开发者控制动画的时间,包括持续时间、延迟、反向播放和循环等。
  • 回调和事件: 他的API还提供了丰富的回调功能,允许在动画开始、完成、暂停或取消时执行特定的代码。
  • 序列动画: 允许将多个动画组合成序列,方便管理复杂的动画效果。
  • 插件支持:扩展性强,支持多种插件和自定义功能,开发者可以根据需要扩展其功能。

二、DOTween的使用

(一)使用前注意事项

1、引入命名空间

1
using DG.Tweening

2、进行初始化

在创建Tween动画之前,必须先给DoWeen初始化分配内存空间,否则DoTween会自动使用默认配置完成初始化,

推荐手动提前初始化,在所有动画逻辑之前调用手动初始化原因:默认内存很小,平凡的床架和销毁动画会频繁扩容数组,产生大量GC;

注意:

  • 全局仅需执行一次,重复调用不生效,不会覆盖配置;
  • 切换场景不需要重复 Init,整个游戏生命周期初始化一次即可。

手动初始化示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
using DG.Tweening;

public class GameEntry : MonoBehaviour
{
    void Awake()
    {
        // 手动初始化 + 预分配动画容量(适配大量装配动画)
           DOTween.Init(
            recycleAllByDefault: true,
            useSafeMode: true,
            logBehaviour: LogBehaviour.ErrorsOnly
         ) .SetCapacity(500, 50); 
        // 参数说明 Init(autoKillAll, useSafeMode, logLevel)
        // SetCapacity(tweener最大数量, sequence最大数量)预先开辟 500 个普通 Tweener、50 个 Sequence 复合动画内存。
    }
}
//参数释义:
// recycleAllByDefault:播放完成自动回收复用存入对象池中,true = 自动回收,减少手动 Kill;
// useSafeMode:安全模式,检测物体的Transform是否存在,在物体被销毁,场景被卸载的情况下,不会继续执行当年规划,不会报空引用;
// logLevel:日志等级,打包发布设 LogErrors 只打印报错,屏蔽冗余日志。

3、清除遗留

当前DOTween动画没播放完的时候,在游戏对象上再创建相同属性的动画,会导致动画创建或者播放报错。不同属性的动画天然可以一起跑

例如:

1
2
3
transform.DOMoveX(3, 1);
transform.DORotate(new(0,360,0),1);
transform.DOScale(1.5f,1);

还可以用 Sequence.Join 主动做并行动画 , 为一整段装配动作,段落之间串行先后播放

1
2
3
4
5
6
7
8
Sequence seq = DOTween.Sequence();
// 第一段(并行组1):同步执行
seq.Append(零件靠近位移)
   .Join(零件旋转);

// 第二段(并行组2):必须等第一段全部结束才会执行,串行
seq.Append(零件下压)
   .Join(卡槽同步下压);

清除遗留示例:

1
2
3
4
//先去掉上一个动画进程
transform.DOKill();
//再创建新的动画
transform.DOMove();

4.设置timeScale对动画的影响

默认情况下,设置Time.timeScale = 0 暂停游戏时,Tween动画也会被暂停。

特殊情况下,我们需要在游戏暂停的时候,动画要继续执行,这个时候在创建的动画后加上 .SetUpdate(true) 方法,这样在游戏暂停的时候动画依旧在运行,直到动画结束。

5.类型介绍

所有 DOXXX() 方法返回值统一是 Tween,表示补间动画,我们可以用这个类型声明一个变量来接收创建的动画,用于动画的一些扩展,灵活性更好。这种初始化这些比较基础的还是以Tween为标准的

Tween 是 DOTween 的基类,两个子类:

  1. Tweener:普通单物体单属性动画(位移、旋转、缩放)
  2. Sequence:复合序列动画(也继承自 Tween)

不使用Tween承接动画会导致的缺点,类似协程:

  • 无法精准单独控制这条动画(中途暂停、延迟杀死、修改进度);
  • 重复触发时不能针对性 Kill,只能粗暴 transform.DOKill() 清空物体所有动画;
  • 不方便单独监听、暂停、反转、播放速度调整。

(二)基础API介绍

1、Move移动过渡

移动到指定位置(世界坐标)
1
2
3
4
5
6
transform.DOMove(new Vector3(10f, 2f, 0), 2f, false);
transform.DOMove(Vector3 to, float duration, bool snapping)
	参数说明:
		Vector3 to               目标位置
		float   duration         动画持续时间
		bool    snapping         默认为false,设为true时平滑地将所有值变为整数,即每次移动整数值。
沿着X/Y/Z轴移动到指定位置。(世界坐标)
1
2
3
4
5
6
7
8
transform.DOMoveX(10, 2f, false);
transform.DOMoveY(10, 2f, false);
transform.DOMoveZ(10, 2f, false);
transform.DOMoveX/DOMoveY/DOMoveZ(float to, float duration, bool snapping)
	参数说明:
		float   to				  要移动到的坐标值
		float   duration         动画持续时间
		bool    snapping         默认为false,设为true时平滑地将所有值变为整数,即每次移动整数值。
物体移动到指定位置。(自身坐标)
1
2
3
4
5
6
transform.DOLocalMove(new Vector3(10f, 2f, 0), 10f, false);
transform.DOLocalMove(Vector3 to, float duration, bool snapping)
 	参数说明:
 		Vector3 to               要移动到的位置
		float   duration         动画持续时间
		bool    snapping         默认为false,设为true时平滑地将所有值变为整数,即每次移动整数值。
跳跃到指定位置。(世界坐标)相比较于移动多了每次跳跃时的高度
1
2
3
4
5
6
7
8
transform.DOJump(new Vector3(5, 0, 0), 10, 3, 1f, false);
transform.DOJump(Vector3 endValue, float jumpPower, int numJumps, float duration, bool snapping)
	参数说明:
		 Vector3 endValue         最终要跳跃到的位置
		 float   jumpPower        跳跃的强度,决定跳跃的高度(当前位置Y加上该值)
		 int     numJumps         跳跃的次数
		 float   duration         动画持续时间
		 bool    snapping         默认为false,设为true时平滑地将所有值变为整数,即每次移动整数值。
跳跃到指定位置。(自身坐标)
1
2
3
4
5
6
7
8
transform.DOLocalJump(new Vector3(10, 0, 0), 10, 3, 2f, false);
transform.DOLocalJump(Vector3 endValue, float jumpPower, int numJumps, float duration, bool snapping)
	参数说明:
		 Vector3 endValue         最终要跳跃到的位置
		 float   jumpPower        跳跃的强度,决定跳跃的高度(当前位置Y加上该值)
		 int     numJumps         跳跃的次数
		 float   duration         动画持续时间
		 bool    snapping         默认为false,设为true时平滑地将所有值变为整数,即每次移动整数值。

2. Rotate 旋转过渡

旋转到指定的值(根据欧拉角),世界坐标
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
transform.DORotate(new Vector3(0, 90, 0), 0.1f, RotateMode.Fast);
transform.DORotate(Vector3 to, float duration, RotateMode mode)
	参数:
		Vector3		to				旋转的目标值
		float		duration		旋转过渡时间
		RotateMode	mode     		参数 RotateMode 是覆盖、改写旋转运算规则的开关,优先级高于函数本身的默认坐标系
				Fast				不填写的默认模式,绝对最终欧拉角(走最短角度),参考本地局部坐标系,(绝对角度),
				FastBeyond360		多圈旋转,可以旋转超过360°参考本地局部坐标系(绝对角度)
				WorldAxisAdd		以世界坐标为轴做叠加旋转,与transform.Rotate(new Vector3(20, 0, 0),Space.World)作用类似,最终值始终被视为相对值(增量角度)
				LocalAxisAdd		以物体局部坐标为轴叠加旋转与transform.Rotate(new Vector3(20, 0, 0),Space.Self)作用类似,最终值始终被视为相对值。(增量角度)
旋转到指定的值(四元数),世界坐标
1
2
3
4
5
6
Quaternion targetRotation = Quaternion.Euler(0, 90, 0);//表示绕 Y 轴旋转 90 度,四元数首先要把欧拉角换成四元数进行旋转操作
transform.DORotateQuaternion(targetRotation, 1f);
transform.DORotateQuaternion(Quaternion to, float duration)
	参数:
		Quaternion	to				要旋转到的目标值四元数
		float		duration		旋转的过渡时间
旋转转到指定的值(根据欧拉角),自身坐标
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
transform.DOLocalRotate(new Vector3(0, 90, 0), 0.5f, RotateMode.Fast);
transform.DOLocalRotate(Vector3 to, float duration, RotateMode mode)
	参数:
		Vector3		to				旋转的目标值
		float		duration		旋转的过渡时间
		RotateMode	mode
				Fast				(默认值)采用最短路径,即旋转不会超过360°
				FastBeyond360		旋转超过360°
				WorldAxisAdd		与transform.Rotate(new Vector3(20, 0, 0),Space.World)作用类似,最终值始终被视为相对值
				LocalAxisAdd		与transform.Rotate(new Vector3(20, 0, 0),Space.Self)作用类似,最终值始终被视为相对值
旋转到指定的值(四元数),自身坐标
1
2
3
4
5
6
Quaternion targetRotation = Quaternion.Euler(0, 90, 0);//表示绕 Y 轴旋转 90 度
transform.DOLocalRotateQuaternion(targetRotation, 0.5f);
transform.DOLocalRotateQuaternion(Quaternion to, float duration)
	参数:
		Quaternion	to				要旋转到的目标值四元数
		float		duration		旋转的过渡时间
朝向目标方向,LookAt看向谁,即旋转目标使得朝向指定的位置方向(只计算一次旋转)
1
2
3
4
5
6
7
transform.DOLookAt(new Vector3(0, 90, 0), 0.5f, AxisConstraint.None, Vector3.up);
transform.DOLookAt(Vector3 towards, float duration, AxisConstraint axisConstraint = AxisConstraint.None, Vector3 up = Vector3.up)
	参数:
		 Vector3			 towards			旋转目标值
		 float	    		 duration			旋转总用时
		 AxisConstraint		 axisConstraint 	旋转最终轴约束,禁止旋转当前周。组合示例 AxisConstraint.Y | AxisConstraint.X 锁定多轴。(默认值为AxisConstraint.None不限制任何轴)
		 Vector3             up                 定义向上方向的矢量。(默认值为Vector3.up)
朝向目标方向,Look At看向谁,即旋转目标使其朝向指定的位置方向,每帧更新 lookAt 位置
1
2
3
4
5
6
7
transform.DODynamicLookAt(new Vector3(0, 90, 0), 0.5f, AxisConstraint.None, Vector3.up);
transform.DODynamicLookAt(Vector3 towards, float duration, AxisConstraint axisConstraint = AxisConstraint.None, Vector3 up = Vector3.up)
	参数:
		 Vector3			 towards			旋转目标值
		 float	    		 duration			旋转总用时
		 AxisConstraint		 axisConstraint 	旋转最终轴约束,只旋转此轴(默认值为AxisConstraint.None)
		 Vector3             up                 定义向上方向的矢量(默认值为Vector3.up)尽可能让物体自身 up 贴近世界 Y 向上。做一个防止侧翻的限制

3、Scale缩放过渡

将物体放大(缩小)到指定倍数或者大小
1
2
3
4
5
6
transform.DOScale(new Vector3(1.5, 1.5, 1.5), 0.5f);
transform.DOScale(2f, 0.5f);
transform.DOScale(float/Vector3 to, float duration)
	参数:
		float/Vector3 			to					浮点数为倍数,向量为指定大小
		float 					duration			放大/缩小总消耗时间
对物体进行某一轴方向进行放大、缩小
1
2
3
4
5
transform.DOScaleX/DOScaleY/DOScaleZ(1.5f, 1.5f);
transform.DOScaleX/DOScaleY/DOScaleZ(float to, float duration)
	参数:
		float					to					放大到的倍数
		float 					duration			放大/缩小总消耗时间

4.Punch冲击

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
受到冲击后的回弹效果
transform.DOPunchPosition();
transform.DOPunchPosition(Vector3 punch, float duration, int vibrato, float elasticity, bool snapping)
	参数:
		Vector3					punch 				要被击打到的最远位置(相对值,相对于局部坐标)
		float					duration			总持续时间
		int						vibrato				物体振动频率
		float					elasticity			值一般在0到1之间,0表示起点到冲击方向的震荡,1表示为一个完整的震荡,可能会超过起点,个人感觉后者效果更好。
		bool					snapping			是否进行平滑插值

受到冲击后旋转效果
transform.DOPunchRotation()
transform.DOPunchRotation(Vector3 punch, float duration, int vibrato, float elasticity)
	参数:
		Vector3					punch 				要被击打到的角度(相对值,相对于局部坐标)
		float					duration			总持续时间
		int						vibrato				物体旋转频率
		float					elasticity			值一般在0到1之间,0表示最初角度到最大角度的旋转,1表示为一个完整的旋转,可能会超过最远角度。

实现一个弹性效果,反复弹,最终复原。
transform.DOPunchScale()
transform.DOPunchScale(Vector3 punch, float duration, int vibrato, float elasticity)
	参数
		Vector3					punch 				弹到的大小
		float					duration			总持续时间
		int						vibrato				物体放缩频率
		float					elasticity			值一般在0到1之间,0表示最初角度到目标大小的放缩,1会产生负值,出现警告。

5.Text文本动画

1
GetComponent<Text>().DOText("今天天气真不错!", 2);//文本内容,打字显现的事件

6、震动效果

1
2
3
4
//持续时间,其余默认
transform.DOShakePosition(1);
//持续时间、强度(下为只在X、Y方向上震动),规定在哪个轴上面震动
transform.DOShakePosition(1,new Vector3(3,3,0));

7. Color 颜色过渡

文字的颜色会从原本颜色缓慢变为红色,过渡时间为1秒

1
GetComponent<Text>().DOColor(Color.red, 1);

8. Fade 透明度

文字的透明度会在2s内从原来的透明度变为1

1
GetComponent<Text>().DOFade(1, 2);

三、DoTween的高阶用法

(一)DOTween.To()

DOTween.To() 是 DOTween 插件中的一个非常灵活且常用的 API,用于创建和控制动画。具体用法像这样:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
Vector3 myvalue = new Vector3(0, 0, 0);
DOTween.To(() => myvalue, x => myvalue = x, new Vector3(10, 10, 10), 2);//这是一个Lambda表达式,等号左边随便定义,该委托会把中间值传给当前变量,再由lambda表达式进行后续操作,右边表示要进行的操作
                 要移动的初始值                目标值                时间
DOTween.To(getter, setter, endValue, duration);
	参数说明
		getter			一个函数,用于获取当前值。它应该返回一个 float、Vector3、Color 等类型的值,具体取决于你要动画化的属性。
		setter			一个函数,用于设置目标值。它接受一个参数(目标值),并将其应用于对象的属性。
		endValue		动画的结束值。即动画完成时,属性应该达到的值。
		duration		动画的持续时间,单位为秒。
示例 1: 动画化 float 值,targetValue 将在 2 秒内从 0 动画到 1。
float targetValue = 0f;
DOTween.To(() => targetValue, x => targetValue = x, 1f, 2f);

示例 2: 动画化 Vector3 值,物体的位置将在 3 秒内从当前的位置移动到 (0, 10, 0)。
Vector3 targetPosition = new Vector3(0, 0, 0);
Transform myTransform = gameObject.transform;
DOTween.To(() => myTransform.position, x => myTransform.position = x, new Vector3(0, 10, 0), 3f);

示例 3: 动画化 Color 值,物体的材质颜色将在 1 秒内变为红色。
Renderer myRenderer = GetComponent<Renderer>();
Color targetColor = Color.red;
DOTween.To(() => myRenderer.material.color, x => myRenderer.material.color = x, targetColor, 1f);

注:Lambda表达式是C#中的匿名函数一行搞定,只定义函数体直接当参数的传出或者是作为按钮等直接订阅的部分,

(二)From()

从目标位置移动到当前位置,

1
2
3
4
5
6
绝对位置,若当前坐标(1,0,0),即从5运动到1,先从1闪现到5然后再在指定的时间内移动到1
transform.DOMoveX(5, 1).From();	//规定了起点和终点有指向性
transform.DOMoveX(5, 1).From(false);//世界坐标

相对位置,若当前坐标(1,0,0),即从6运动到1(6-1=5,相对位移5)
transform.DOMoveX(5, 1).From(true);//相对坐标

(三).Set方法

对于Tween的处理,算是链式配置方法,可以无限链式标注,多个叠加到一起,返回值算是Tween

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Tween tween = transform.DOMoveX(5, 2);

.SetDelay(float delay):
作用: 设置动画开始前的延迟时间(以秒为单位)。
示例:
tween.SetDelay(1f); // 延迟1秒后开始

.SetEase(Ease easeType):
作用: 设置动画的缓动类型(如线性、加速、减速等,类似设置PPT动画的出现效果)。
示例:
tween.SetEase(Ease.InOutQuad); // 使用 InOutQuad 缓动

.SetLoops(int loops, LoopType loopType):
作用: 设置动画的循环次数和循环类型(如循环、反向循环等)。
示例:
tween.SetLoops(3, LoopType.Yoyo); // 循环3次,反向循环

.SetAutoKill(bool autoKill):
作用: 设置动画完成后是否自动销毁。
示例:
tween.SetAutoKill(false); // 动画完成后不自动销毁

.SetId(object id):
作用: 设置动画的 ID,以便后续查找和管理。
示例:
tween.SetId("myTween"); // 设置 ID 为 "myTween"

.SetUpdate(bool isIndependent):
作用: 设置动画是否独立于时间更新(用于在时间暂停时仍然更新)。
示例:
tween.SetUpdate(true); // 在时间暂停时仍然更新
.SetEase() 方法缓动类型举例。
  • In指的是一种由慢到快的方式。
  • Out则指的是由快到慢。
  • Sine(正弦曲线)指的是比较平滑的过渡。
  • Quad则指的是会有更明显的快慢变化,比Quad速度变化更剧烈的,还有Cubic、Quart、Quint等。
  • Expo代表指数曲线,还有更多特殊的曲线,如有弹性的Elastic、先后退再前进的Back,以及Bounce(弹跳曲线)。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Ease.Linear: 匀速运动,速度不变。
Ease.InQuad: 加速的二次方曲线。
Ease.OutQuad: 减速的二次方曲线。
Ease.InOutQuad: 先加速后减速的二次方曲线。
Ease.InCubic: 加速的三次方曲线。
Ease.OutCubic: 减速的三次方曲线。
Ease.InOutCubic: 先加速后减速的三次方曲线。
Ease.InQuart: 加速的四次方曲线。
Ease.OutQuart: 减速的四次方曲线。
Ease.InOutQuart: 先加速后减速的四次方曲线。
Ease.InQuint: 加速的五次方曲线。
Ease.OutQuint: 减速的五次方曲线。
Ease.InOutQuint: 先加速后减速的五次方曲线。
Ease.InSine: 使用正弦函数加速。
Ease.OutSine: 使用正弦函数减速。
Ease.InOutSine: 使用正弦函数加速和减速。
Ease.InExpo: 指数加速。
Ease.OutExpo: 指数减速。
Ease.InOutExpo: 指数加速和减速。
Ease.InCirc: 圆形加速。
Ease.OutCirc: 圆形减速。
Ease.InOutCirc: 圆形加速和减速。
Ease.InBounce: 先加速后弹跳。
Ease.OutBounce: 先弹跳后减速。
Ease.InOutBounce: 先加速后弹跳再减速。
Ease.InBack: 加速并略微超出目标。
Ease.OutBack: 减速并略微超出目标。
Ease.InOutBack: 先加速后减速并略微超出目标。
Ease.Flash: 短暂的闪烁效果。

(四)控制和回调

1.开始、暂停和结束动画,也算链式配置方法,返回值Tween
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
开始动画:
通常通过调用动画方法来开始,例如 DOMove、DOFade 等。
示例:
Tween tween = transform.DOMove(target.position, duration);

暂停动画:
使用 Pause() 方法暂停动画。
示例:
tween.Pause(); // 暂停动画

恢复动画:
使用 Play() 方法恢复动画。
示例:
tween.Play(); // 恢复动画

结束动画:
使用 Kill() 方法结束动画,并可选择是否销毁。
这里有个默认参数complete(默认值是false)。 true:先结束动画,将目标设置为其最终值然后销毁;false:直接销毁
示例:
tween.Kill(); // 直接销毁动画

重启动画:
使用 Restart() 方法重新开始动画。
示例:
tween.Restart(); // 重新开始动画

Pause、DOPlay、DOPlayForward、DOPlayBackwards、DORestart
动画暂停、动画播放、动画向前播放、动画倒放

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
//DOTween播放会生成动画,动画保存在Tweener信息中,默认动画播放完会被销毁,要想倒放,必须设为不被销毁
//tweener也会播放动画
Tweener tweener= transform.DOLocalMove(new Vector3(1, 1, 1), 1);
tweener.SetAutoKill(false);
//暂停动画
tweener.Pause();
//播放动画,只播放一次,再次调用不可播放
transform.DOPlay();
//向前播放动画
transform.DOPlayForward();
//动画倒放
transform.DOPlayBackwards();
//重新播放动画:若用的可视化编辑,需取消AutoKill
transform.DORestart();
2. 回调函数

类似生命周期函数,从开始创建到结束的一系列过程

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
.OnStart(Action onStart):
作用: 在动画开始时执行的回调。
示例:
tween.OnStart(() => Debug.Log("动画开始"));

.OnPlay(Action onPlay):
作用: 在动画播放时执行的回调。
示例:
tween.OnPlay(() => Debug.Log("动画播放"));

.OnUpdate(Action onUpdate):
作用: 在每一帧更新时执行的回调。
示例:
tween.OnUpdate(() => Debug.Log("动画更新"));

.OnComplete(Action onComplete):
作用: 在动画完成时执行的回调。
示例:
tween.OnComplete(() => Debug.Log("动画完成"));

.OnKill(Action onKill):
作用: 在动画被杀死时执行的回调。
示例:
tween.OnKill(() => Debug.Log("动画被杀死"));

事件函数
动画播放完成事件函数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
Tweener tweener = transform.DOLocalMoveX(0, 5);
//动画播放完成调用事件函数
tweener.OnComplete(你的方法);

//动画销毁调用事件函数
tweener.OnKill(你的方法);

//动画播放时调用事件函数(一直调用)
tweener.OnPlay(你的方法);

//动画暂停时调用事件函数
tweener.OnPause(你的方法);

//动画重置时调用事件函数
tweener.OnRewind(你的方法);

//动画开始播放时调用事件函数
tweener.OnStart(你的方法);

//动画播放时调用事件函数(一次)
tweener.OnPlay(你的方法);

Tween: 一个通用的动画对象,表示一个动画的实例。它可以是任何类型的动画,比如位置、旋转、缩放、颜色等。他是所有动画的基类,它可以被用来控制动画的播放状态(如播放、暂停、停止等)、设置回调、链式动画等。 动画集合Sequence是Tween 的子类,想要顺序播放一组动画用Sequence

Tweener: 是 Tween 的一个特化、特例、专门分支,表示一种特定类型的动画,它通常用于需要从一个数值变化到另一个数值的情况。允许你在动画中设置开始值和结束值, 支持手动覆盖初始值(.From() 就是 Tweener 专属能力)。

(五)ID使用

动画的ID可以帮助管理和查找特定的动画,对某个特定的动画进行操作,比如暂停、恢复、停止或销毁。使用场景一般用于:

  • 管理动画: 当你有多个动画时,可以通过 ID 来区分和管理它们。
  • 批量操作: 可以通过 ID 批量暂停或停止具有相同 ID 的所有动画。
  • 状态管理: 在游戏中,可以根据不同的状态来控制相应的动画。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
创建一个动画并设置 ID
Tween tween1 = transform.DOMove(target.position, duration)
	.SetId("moveTween")
	.OnComplete(() => Debug.Log("动画1完成"));

创建另一个动画并设置相同的 ID
Tween tween2 = transform.DORotate(new Vector3(0, 180, 0), duration)
	.SetId("moveTween") // 设置相同的 ID
	.OnComplete(() => Debug.Log("动画2完成"));

暂停所有 ID 为 "moveTween" 的动画
DOTween.Pause("moveTween");

恢复所有 ID 为 "moveTween" 的动画
DOTween.Play("moveTween");

杀死所有 ID 为 "moveTween" 的动画
DOTween.Kill("moveTween");

(六)Sequence 复合动画容器

DOTween.Sequence() 是 DOTween 中的一个方法,用于创建序列动画。

序列动画(Sequence Animation) 允许你将多个动画组合在一起,以特定的顺序依次执行。适用于需要在特定时间顺序内执行多个动画的场景,其作用有这几点:

  • 顺序执行: 你可以将多个动画添加到序列中,确保它们按照你希望的顺序依次执行。
  • 组合动画: 可以将不同类型的动画(如移动、旋转、缩放等)组合在一起,形成一个复杂的动画效果。
  • 控制时间: 你可以设置每个动画的延迟、持续时间等参数,使得整个序列动画的表现更加丰富。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

//创建一个序列动画
Sequence loopTween = DOTween.Sequence();

//添加第一个动画:移动到目标位置
loopTween.Append(transform.DOMove(target.position, 1f).SetEase(Ease.Linear));

//添加第二个动画:旋转
loopTween.Append(transform.DORotate(new Vector3(0, 180, 0), 1f).SetEase(Ease.OutBounce));

//添加第三个动画:缩放
loopTween.Append(transform.DOScale(new Vector3(2, 2, 2), 1f).SetEase(Ease.OutElastic));

//播放序列动画
loopTween.Play();

//暂停序列动画
loopTween.Pause();

//停止序列动画
loopTween.Kill();

//重播序列动画
loopTween.Restart();

// 添加一个回调,在序列完成时执行
loopTween.OnComplete(() => Debug.Log("序列动画完成"));

Sequence 特有的方法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Sequence loopTween = DOTween.Sequence();

将一个新的动画添加到序列的末尾。
loopTween.Append(Tween tween);

在序列中添加一个回调函数(序列执行到该位置时会被调用)。
loopTween.AppendCallback(TweenCallback callback);

在序列中添加一个间隔(指定时间内不执行任何动画)。
loopTween.AppendInterval(float interval);

将一个新的动画添加到序列的开头。Prepend和Append刚好相反,一个添加到尾部(Append)一个添加到头部(Prepend)
loopTween.Prepend(Tween tween);

将一个回调函数添加到序列的开头。
loopTween.PrependCallback(TweenCallback callback);

在序列前面添加一个间隔(指定时间内不执行任何动画)。
loopTween.PrependInterval(float interval);

将一个新的动画添加到序列中,与当前动画同时播放。
loopTween.Join(Tween tween);

在指定时间插入一个新的动画。
loopTween.Insert(float time, Tween tween);

在特定时间点插入一个回调。
loopTween.InsertCallback(float atPosition, TweenCallback callback);

关于返回值的问题,所有的函数的返回值本质上都是Tween、多序列的就Sequece,链式设计统一返回父类 Tween,保证连续调用不会断链

仅用于交流学习,记录学习心得