Unity插件——DOtween

DOTween 是一个快速、高效、完全类型安全的面向对象的动画引擎,它允许开发者通过代码控制动画和过渡效果,并且针对 C# 进行了优化。它有许多种类型的动画功能,比如有大量的控制方法(播放、暂停、转到、倒带、完成等),各种回调操作,以不同速度沿线性或弯曲路径对对象进行动画处理,并具有各种方向选项,以及循环(使用 Yoyo 和 Incremental 附加选项)、缓动(包括使用 AnimationCurves 的自定义缓动)等。

官方文档链接:https://dotween.demigiant.com/documentation.php

名词解释

  1. Tweener:一个"Tweener"是一个动画,它接管一个值并对其进行动画处理。简单来说,Tweener是控制一个数值随时间变化的动画工具。
  2. Sequence:一个"Sequence"是一种特殊的动画,它不是接管一个值,而是接管其他动画(tweens),并将它们作为一个组来动画化。Sequence可以看作是一个动画序列,它将多个动画组织起来,按顺序播放。
  3. Tween:"Tween"是一个通用词,既可以指Tweener,也可以指Sequence。它泛指任何一种控制数值随时间变化的动画。
  4. Nested tween:"Nested tween"是指包含在Sequence中的动画。也就是说,一个Sequence可以包含多个Tweener或其他Sequence,这些被包含的动画就被称为嵌套动画。

前缀含义

API中的相同前缀的方法归为一类操作。

  • DO: 这是一个前缀,用于所有与动画相关的快捷操作,这些操作可以直接从已知对象(如变换(transform)或材质(material))启动。同时,它也是DOTween类的主要前缀。
//表示将一个变换对象沿X轴移动100单位,动画持续时间为1秒
transform.DOMoveX(100, 1);
//表示重启当前的动画
transform.DORestart();
//表示播放所有动画
DOTween.Play();
  • Set: 这是一个前缀,用于所有可以链接到动画(tween)的设置(除了From,因为它虽然作为设置使用,但实际上并不是一个设置)。
//表示设置一个动画循环4次,使用Yoyo循环类型(即来回循环),并基于速度设置动画
myTween.SetLoops(4, LoopType.Yoyo).SetSpeedBased();
  • On: 这是一个前缀,用于所有可以链接到动画的回调函数。
//表示当动画开始时调用myStartFunction函数,当动画完成时调用myCompleteFunction函数
myTween.OnStart(myStartFunction).OnComplete(myCompleteFunction);

初始化

在使用Dotween创建tween前必须进行初始化,初始化有两种。

  • 自动初始化:当你第一次创建一个tween时,DOTween会自动使用默认值初始化自己。
  • 手动初始化:推荐使用手动初始化,并且手动初始化必须在创建tween之前,否则没有用。即便你手动初始化了DOTween,你仍然可以随时通过使用DOTween的全局设置来更改初始化设置。
static DOTween.Init(bool recycleAllByDefault = false, bool useSafeMode = true, LogBehaviour logBehaviour = LogBehaviour.ErrorsOnly)
//使用自定义设置初始化,并立即设置容量。
//true 表示开启tween的回收机制。
//true 表示开启安全模式。
//LogBehaviour.Verbose 表示记录所有信息和额外的信息。
//SetCapacity(200, 10) 设置了Tweeners和Sequences的初始容量,分别设置为200和10。这有助于优化性能,减少运行时的内存分配。
DOTween.Init(true, true, LogBehaviour.Verbose).SetCapacity(200, 10);

创建动画

A. 通用方式

这是DOTween中最灵活的动画创建方法,允许你对几乎所有类型的值进行动画处理,无论是公共(public)还是私有(private)的,静态(static)还是动态(dynamic)的值。
DOTween可以补间这些类型的值: float,double,int,uint,long,ulong,Vector2/3/4,Quaternion,Rect,RectOffset,Color,string

方法为static DOTween.To(getter, setter, to, float duration)这是一个静态方法,用于创建一个动画,它会将一个属性从当前值平滑地过渡到指定的结束值。

  • getter: 这是一个委托(delegate),用于获取需要动画化属性的当前值。
  • setter: 这是一个委托,用于设置属性的值。
  • to: 这是动画结束时属性应该达到的值。
  • duration: 这是动画持续的时间,单位是秒。
// 将一个名为myVector的Vector3类型的变量从当前值平滑地变化到新的Vector3值(3, 4, 8)在1秒内完成
DOTween.To(()=> myVector, x=> myVector = x, new Vector3(3,4,8), 1);
// 将一个名为myFloat的float类型的变量从当前值平滑地变化到52在1秒内完成
DOTween.To(()=> myFloat, x=> myFloat = x, 52, 1);

B. 快捷方式

DOTween为一些已知的Unity对象(如Transform、Rigidbody和Material)提供了快捷方式。这意味着你可以直接从这些对象的引用开始创建一个补间动画,并且这些对象会自动被设置为补间动画的目标。如:

// 使Transform对象在1秒内移动到新的Vector3位置(2, 3, 4)
transform.DOMove(new Vector3(2,3,4), 1);
// 使Rigidbody对象在1秒内移动到新的Vector3位置(2, 3, 4)
rigidbody.DOMove(new Vector3(2,3,4), 1);
// 使Material对象在1秒内改变其颜色为绿色
material.DOColor(Color.green, 1);

每个快捷方式都有一个FROM版本的补间动画,除了特别指明的以外。你可以通过在Tweener后面链式调用.From()方法,使补间动画表现为从FROM位置开始,而不是TO位置结束。

// 使Transform对象立即跳转到当前位置,然后在1秒内移动到新的Vector3位置(2, 3, 4)
transform.DOMove(new Vector3(2,3,4), 1).From();
// 使Rigidbody对象立即跳转到当前位置,然后在1秒内移动到新的Vector3位置(2, 3, 4)
rigidbody.DOMove(new Vector3(2,3,4), 1).From();
// 使Material对象立即跳转到当前颜色,然后在1秒内改变其颜色为绿色
material.DOColor(Color.green, 1).From();

基本元素快捷方式(常用)

AudioSource
// 使音量从一个值渐变到另一个值
DOFade(float to, float duration)
Camera
// 调整相机的背景颜色
DOColor(Color to, float duration)

// 使相机的位置在X和Y轴上震动(震动持续的时间/ 震动强度/ 震动的振动次数/ 震动的随机性(0到180度))
DOShakePosition(float duration, float/Vector3 strength, int vibrato, float randomness)

// 使相机的旋转在X和Y轴上震动 (震动持续的时间/ 震动强度/ 震动的振动次数/ 震动的随机性(0到180度))
DOShakeRotation(float duration, float/Vector3 strength, int vibrato, float randomness)
Light
// 改变灯光的颜色在给定的持续时间内
DOColor(Color to, float duration)

// 在指定的持续时间内改变灯光的强度
DOIntensity(float to, float duration)
LineRenderer
// 在动画中改变 LineRenderer 的颜色
DOColor(Color2 startValue, Color2 endValue, float duration)
Material
// 将材质的颜色在指定的持续时间duration内变化到新的颜色
DOColor(Color to, float duration)

// 将材质的透明度(Alpha值)变化到to指定的值
DOFade(float to, float duration)

// 通过渐变颜色to来变化材质的颜色
DOGradientColor(Gradient to, float duration)

// 将材质的纹理偏移变化到to指定的值
DOOffset(Vector2 to, float duration)

// 将材质的颜色变化到指定的颜色 这种动画方式允许多个颜色动画在同一材质上协同工作,而不是相互冲突
DOBlendableColor(Color to, float duration)
Transform

Move

// 将目标对象的位置移动到指定的Vector3位置,如果snapping为真,则位置值会被平滑地调整为整数
DOMove(Vector3 to, float duration, bool snapping)

// 只沿着X、Y或Z轴移动目标对象的位置
DOMoveX/DOMoveY/DOMoveZ(float to, float duration, bool snapping)

// 将目标对象的本地位置移动到相对于其父对象的指定Vector3位置
DOLocalMove(Vector3 to, float duration, bool snapping)

// 使目标对象跳跃到指定的endValue位置,跳跃次数为numJumps,每次跳跃的力量为jumpPower
DOJump(Vector3 endValue, float jumpPower, int numJumps, float duration, bool snapping)

Rotate

// 将目标对象旋转到指定的Vector3角度
DORotate(Vector3 to, float duration, RotateMode mode)

// 使用四元数将目标对象旋转到指定的Quaternion旋转状态
DORotateQuaternion(Quaternion to, float duration)

// 相对于其父对象,将目标对象的本地旋转旋转到指定的Vector3角度
DOLocalRotate(Vector3 to, float duration, RotateMode mode)

// 相对于其父对象,使用四元数旋转目标对象
DOLocalRotateQuaternion(Quaternion to, float duration)

// 使目标对象朝向指定的towards位置
DOLookAt(Vector3 towards, float duration, AxisConstraint axisConstraint = AxisConstraint.None, Vector3 up = Vector3.up)

//  动态地使目标对象朝向指定的towards位置,每帧更新朝向
DODynamicLookAt(Vector3 towards, float duration, AxisConstraint axisConstraint = AxisConstraint.None, Vector3 up = Vector3.up)

Scale

// 将目标对象的缩放调整到指定的float或Vector3值
DOScale(float/Vector3 to, float duration)
DOScaleX/DOScaleY/DOScaleZ(float to, float duration)

Punch

// 使目标对象的位置向指定的punch方向打击,并在duration时间内返回原位
DOPunchPosition(Vector3 punch, float duration, int vibrato, float elasticity, bool snapping)

//  使目标对象的旋转向指定的punch方向打击
DOPunchRotation(Vector3 punch, float duration, int vibrato, float elasticity)

// 使目标对象的缩放向指定的punch大小打击
DOPunchScale(Vector3 punch, float duration, int vibrato, float elasticity)

Shake

// 在指定的duration时间内,使目标对象的位置随机摇晃
DOShakePosition(float duration, float/Vector3 strength, int vibrato, float randomness, bool snapping, bool fadeOut, ShakeRandomnessMode randomnessMode)

// 使目标对象的旋转随机摇晃
DOShakeRotation(float duration, float/Vector3 strength, int vibrato, float randomness, bool fadeOut, ShakeRandomnessMode randomnessMode)

// 使目标对象的缩放随机摇晃
DOShakeScale(float duration, float/Vector3 strength, int vibrato, float randomness, bool fadeOut, ShakeRandomnessMode randomnessMode)

Path

//  使目标对象沿着指定的waypoints路径移动
DOPath(Vector3[] waypoints, float duration, PathType pathType = Linear, PathMode pathMode = Full3D, int resolution = 10, Color gizmoColor = null)

DOLocalPath(Vector3[] waypoints, float duration, PathType pathType = Linear, PathMode pathMode = Full3D, int resolution = 10, Color gizmoColor = null)

Spiral

// 使目标对象沿着螺旋路径移动
DOSpiral(float duration, Vector3 axis = null, SpiralMode mode = SpiralMode.Expand, float speed = 1, float frequency = 10, float depth = 0, bool snapping = false)

Tween

// 将另一个 tween 的时间缩放属性进行动画处理
DOTimeScale(float toTimeScale, float duration)

例子:
// 假设你有一个 tween 正在运行
Tween myTween = DOTween.To(...);

// 逐渐将 tween 的速度提高到两倍,持续时间为 1 秒
myTween.DOTimeScale(2f, 1f);

// 然后再逐渐恢复到正常速度,持续时间也是 1 秒
myTween.DOTimeScale(1f, 1f);

Text

// 将文本的颜色变化到指定的颜色
DOColor(Color to, float duration)

// 将文本的透明度(Alpha值)变化到指定的数值
DOFade(float to, float duration)

// 将文本内容变化到指定的字符串
DOText(string to, float duration)

C. 其他方法

Sequence

用于创建一个动画序列,然后按照顺序实现复杂的动画组合

static DOTween.Sequence()// 获取一个新的序列对象
Append(Tween tween)// 将补间动画添加到序列的末尾
AppendCallback(TweenCallback callback)// 将回调添加到序列的末尾
AppendInterval(float interval)// 将时间间隔添加到序列的末尾
Insert(float atPosition, Tween tween)// 在给定的时间位置插入给定的补间动画
InsertCallback(float atPosition, TweenCallback callback)// 在给定的时间位置插入给定的回调
Join(Tween tween)// 将给定的补间动画插入到序列中,与最后一个添加到序列的补间动画或回调同时播放
Prepend(Tween tween)// 将补间动画添加到序列的开头
PrependCallback(TweenCallback callback)// 将回调添加到序列的开头
PrependInterval(float interval)// 将时间间隔添加到序列的开头

例子:

Sequence mySequence = DOTween.Sequence();
mySequence.Append(transform.DOMoveX(45, 1));
mySequence.Append(transform.DORotate(new Vector3(0,180,0), 1));
mySequence.PrependInterval(1);
mySequence.Insert(0, transform.DOScale(new Vector3(3,3,3), mySequence.Duration()));

//简化代码
Sequence mySequence = DOTween.Sequence();
mySequence.Append(transform.DOMoveX(45, 1))
          .Append(transform.DORotate(new Vector3(0,180,0), 1))
          .PrependInterval(1)
          .Insert(0, transform.DOScale(new Vector3(3,3,3), mySequence.Duration()));
Set开头(补充)
// 设置动画的循环选项
SetLoops(int loops);

// 为Tweener设置延迟启动时间
tweener.SetDelay(float delay);

// 当使用了该参数的时候,动画事件的第二个参数就变成了运动到目标点的速度
transform.DOMove(new Vector3(2, 5, 3), 5).SetSpeedBased(true);

// 将动画反转,使其从结束到开始播放
SetInverted();

// 设置动画的更新类型,并决定是否忽略Unity的时间缩放和最大Delta时间
SetUpdate(UpdateType updateType, bool isIndependentUpdate = false)

// 如果设置为true,动画在完成时将自动销毁,否则将保留在内存中,以便可以重用
SetAutoKill(bool autoKillOnCompletion = true)

// 设置动画的缓动类型,可以是默认的缓动类型、动画曲线或自定义缓动函数
SetEase(Ease easeType \ AnimationCurve animCurve \ EaseFunction customEase);

Ease.Linear:线性缓动,匀速运动。
Ease.InQuad、Ease.OutQuad、Ease.InOutQuad:二次缓动,可以实现平滑加速、平滑减速、先加速后减速的效果。
Ease.InOutSine:正弦缓动,产生类似物体来回摆动的效果。
Ease.OutBounce:反弹缓动,产生类似物体撞击墙壁后反弹的效果。
Ease.OutElastic:弹簧缓动,产生类似于物体被拉伸后回弹的效果。

链式回调
OnComplete(TweenCallback callback): 动画完成时调用。
OnKill(TweenCallback callback): 动画被销毁时调用。
OnPlay(TweenCallback callback): 动画开始播放时调用。
OnPause(TweenCallback callback): 动画从播放状态变为暂停状态时调用。
OnRewind(TweenCallback callback): 动画回退时调用。
OnStart(TweenCallback callback): 动画首次开始时调用。
OnStepComplete(TweenCallback callback): 动画完成单个循环周期时调用。
OnUpdate(TweenCallback callback): 动画每次更新时调用。
OnWaypointChange(TweenCallback<int> callback): 路径动画的当前路径点改变时调用。

例子:

// Callback without parameters
transform.DOMoveX(4, 1).OnComplete(MyCallback);
// Callback with parameters
transform.DOMoveX(4, 1).OnComplete(()=>MyCallback(someParam, someOtherParam));
控制方法
//暂停动画
transform.DOPause();
//播放动画,只播放一次,再次调用不可播放
transform.DOPlay();
//向前播放动画
transform.DOPlayForward();
//动画倒放
transform.DOPlayBackwards();
//重新播放动画
transform.DORestart();
//杀死动画
transform.DOKill();
协程
tween = transform.DOMove(Vector3.one, 2).SetLoops(3);
StartCoroutine(Wait());

private IEnumerator Wait()
{
    //等动画播放完再执行下面的语句
    yield return tween.WaitForCompletion();
    Debug.Log(0);

    //等待动画循环到第几次执行下面的语句
    yield return tween.AsyncWaitForElapsedLoops(2);
    Debug.Log(1);

    //动画被杀时执行下面的语句
    yield return tween.WaitForKill();
    Debug.Log(2);

    //动画执行到该时间位置才会继续执行下面的方法
    yield return tween.WaitForPosition(1.5f);
    Debug.Log(3);

    //动画重新播放的时候执行下面的方法
    yield return tween.WaitForRewind();
    Debug.Log(4);

    //动画开始执行的时候往下执行
    yield return tween.WaitForStart();
    Debug.Log(5);
}

  • 18
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值