UP | HOME

DOTween

Table of Contents

翻译一下官方文档。熟悉以下 DOTween 的用法。

<!– more –>

DOTween

名称术语

Tweener 用来对一个值做动画
Sequence 特殊的 tween,它控制一组 tween,并对他们做动画
Tween 一个抽象的单词,它可以表示 Tweener 和 Sequence
Nested tween Sequence 中的 tween

Tweener

通用方式创建 Tweener

static DOTween.To(getter, setter, to, float duration)
  • getter
    代理返回做动画的属性
  • setter
    通过该代理来设置做动画的属性
  • to
    要到达的终点值
  • duration
    动画持续时间
// Tween a Vector3 called myVector to 3,4,8 in 1 second
DOTween.To(()=> myVector, x=> myVector = x, new Vector3(3,4,8), 1);
// Tween a float called myFloat to 52 in 1 second
DOTween.To(()=> myFloat, x=> myFloat = x, 52, 1);

快捷方式创建 Tweener

每种快捷方式创建的 tween 都有一个可选的 FROM 版本(除去那些明显指出不存在的)。只要在 tween 后面链接一二个 From,就可以将 tween 的行为从 TO 变为 FROM.

transform.DOMove(new Vector3(2,3,4), 1);
rigidbody.DOMove(new Vector3(2,3,4), 1);
material.DOColor(Color.green, 1);

transform.DOMove(new Vector3(2,3,4), 1).From();
rigidbody.DOMove(new Vector3(2,3,4), 1).From();
material.DOColor(Color.green, 1).From();
对物体坐标系属性做动作

DOXXXLocal

在原始属性上叠加变化值

类似于 cocos 中的 By
DOBlendableXXXBy

等待一定时间

SetDelay(delayTime)

Seqence

一个 tween 只能嵌套在一个 sequence 中,不能在不同的 sequence 中使用同一个 tween。
不能使用空的 Sequence.

创建一个 Sequence

Sequence mySequence = DOTween.Sequence();

向 Sequence 中添加 tween、intervals 以及 callbacks

Append(Tween tween)

将 tween 添加到 sequence 的末尾

mySequence.Append(transform.DOMoveX(45, 1));
AppendCallback(TweenCallback callback)

将 callback 添加到 sequence 的末尾

AppendInterval(float interval)

将 时间间隔 interval 添加到 sequence 的末尾

Insert(float atPosition, Tween tween)

将给定的 tween 插入到特定的时间位置,这样就可以将多个 tween 重叠在一起。

InsertCallback(float atPosition, TweenCallback callback)

将给定的 callback 插入到特定的时间位置。

Join(Tween tween)

将给定的 tween 插入到 sequence 中最后一个 tween 或 callback 的时间位置。
该方法相当于 cocos2d-x 中的 spawn

Prepend(Tween tween)

将 tween 添加到 sequence 的开始

PrependCallback(TweenCallback callback)

将 callback 添加到 sequence 的开始

PrependInterval(float interval)

将 时间间隔 interval 添加到 sequence 的开始

EXAMPLE
// Grab a free Sequence to use
Sequence mySequence = DOTween.Sequence();
// Add a movement tween at the beginning
mySequence.Append(transform.DOMoveX(45, 1));
// Add a rotation tween as soon as the previous one is finished
mySequence.Append(transform.DORotate(new Vector3(0,180,0), 1));
// Delay the whole Sequence by 1 second
mySequence.PrependInterval(1);
// Insert a scale tween for the whole duration of the Sequence
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()));

设置,选项和回调函数

全局的设置

一般设置
static LogBehaviour DOTween.logBehaviour

默认值为 LogBehaviour.ErrorsOnly
LogBehaviour.ErrorsOnly - 只打印错误日志
LogBehaviour.Default - 打印错误和警告日志
LogBehaviour.Verbose - 打印错误,警告以及额外的信息

static bool DOTween.maxSmoothUnscaledTime

默认值为 0.15f
如果 useSmoothDeltaTime 为 true,该值就表示时间独立的 tween 在时间补间时所经过的最大时间间隔

static bool DOTween.showUnityEditorReport

默认值为 false
如果设置为 true,则在 Editor 下退出 Play 模式时,会打印 DOTween 报告,里面包含运行期间 Tweener 和 Sequences 的最大数目,可以依据这些信息来优化项目。
需要注意的是,这会轻微减低 Unity 编辑器的性能。

static float DOTween.timeScale

默认值为 1
全局的 timeScale 值,会应用到所有的 tween。

static bool DOTween.useSafeMode

默认值为 true
如果设置为 true,会轻微减慢 tween,但是运行会更安全。这样 DOTween 会自动处理 tween 在运行期间,目标被删除掉的情况。
设置为 false,意味着你必须自己保证在销毁目标之前,杀死 tween。
警告:
在 iOS 模式下,safeMode 只在 stripping level 被设置为 “Strip Assemblies”或者 Script Call Optimization 被设置为“Slow and Safe”时才可用。

static bool DOTween.useSmoothDeltaTime

默认值为 false
如果为 true,则 对于 UpdateType.Normal 和 UpdateType.Late 类型的 tween,DOTween 将会使用 Time.smoothDeltaTime 代替 Time.deltaTime.对于设置了 timeScaleIndependent=true 的 tween,DOTween 会使用前一次 timestep 和 maxSmoothUnscaledTime 之间的一个值。
设置该选项为 True,将会让动画更加流畅。

static DOTween.SetTweensCapacity(int maxTweeners, int maxSequences)

为了让 DOTween 执行效率更高,你可以限制激活的 tween 的最大数目。如果在执行过程中超过这个值,界限会自动增大。如果你已经知道最大界限,那么就可以手动设置默认值为最大界限,从而避免界限增大时造成卡动。

新创建 tween 都会应用的设置
static bool DOTween.defaultAutoKill

默认值:true
默认情况下,tween 会自动释放

static AutoPlay DOTween.defaultAutoPlay

默认值:AutoPlay.All
默认情况下,创建的 tween 会自动播放

static float DOTween.defaultEaseOvershootOrAmplitude

默认值:1.70158f

  • TODO
static float DOTween.defaultEasePeriod

默认值:0

  • TODO
static Ease DOTween.defaultEaseType

默认值:Ease.OutQuad
默认情况下,创建的 tween 缓动类型为 Ease.OutQuad

static LoopType DOTween.defaultLoopType

默认值:LoopType.Restart
默认情况下,创建的 tween 每次循环播放时会重新开始播放

static bool DOTween.defaultRecyclable

默认值:false
默认情况下,创建的 tween 不可以循环利用

static bool DOTween.defaultTimeScaleIndependent

默认值:false
是否 Unity 的 timeScale 会被计算在内。

static UpdateType DOTween.defaultUpdateType

默认值:UpdateType.Normal
默认情况下,创建的 tween 其更新类型为 UpdateType.Normal
关于 UpdateType 的解释可以查看右边链接: 1

Tweener 和 Seqence 共用的设置

实例属性
timeScale

默认值:1
设置 tween 内部的时间缩放值
这个值可以被其他的 tween 来修改,从而实现流畅的慢动作效果。

myTween.timeScale = 0.5f;
级联设置
SetAs(Tween tween \ TweenParams tweenParams)

通过给定的另一个 tween 的设置来设置当前 tween 的参数,或者通过 tweenParams 来设置 当前 tween 的参数。(可以设置的参数有 id,ease,loops,delay,timeScale,callbacks 等等)。
如果,当前的 tween 已经开始,则该设置将不会生效。

transform.DoMoveX(4,1).SetAs(myOtherTween);
SetAutoKill(bool autoKillOnCompletion=true)

默认情况下,tween 在执行完后会被自动删除,可以通过该设置来禁止默认操作。

transform.DoMoveX(4,1).SetAutoKill(false);
SetEase(Ease easeType\AnimationCurve animCurve\ EaseFunction customEase)

如果应用于 Sequence,这种缓动将会作用于整个 Sequence,就好比他是单个动画时间线。默认情况下 Sequence 的缓动类型为 Ease.Linear,它独立于全局的缓动设置
另外,也可以设置下面的参数。他们只能和 Back 和 Elastic 类型的缓动一起使用:

  • overshoot
    超过返回缓动类型 所使用的 超过参数(默认值为 1.70158)。
    闪烁缓动类型 所使用的闪烁次数参数。
  • amplitude
    来回弹缓动类型 所使用的 振幅参数
  • period
    TODO

EaseFactory.StopMotion 是可以加到缓动外面的额外一层,它可以作为任何一种缓动的包装。

transform.DOMoveX(4, 1).SetEase(Ease.InOutQuint);
transform.DOMoveX(4, 1).SetEase(myAnimationCurve);
transform.DOMoveX(4, 1).SetEase(MyEaseFunction);

transform.DOMoveX(4, 1).SetEase(EaseFactory.StopMotion(5, Ease.InOutQuint));
SetId(object id)

为 tween 设置一个 id,该值可以是 int,string,object 或其他类型。

transform.DOMoveX(4, 1).SetId("supertween");
SetLoops(int loops, LoopType loopType = LoopType.Restart)

设置 tween 的循环选项。
如果 tween 已经开始,则该设置无效。如果一个 tween 在 Sequence 内,则无限循环将不会被应用。

  • loops
    设置循环次数。-1 表示无限循环
  • loopType
    LoopType.Restart - 当一次循环结束时,下次循环会从头开始播放.
    LoopType.Yoyo - 当一次循环结束时,会倒序播放回开始。
    LoopType.Incremental - 每次循环结束后,endValue 和 startValue 之间的差值会被加到 endValue 上。(这种类型只能在 Tweener 上使用)
transform.DOMoveX(4, 1).SetLoops(3, LoopType.Yoyo);
SetRecyclable(bool recyclable)
  • recyclable
    如果为 true,杀死这个 tween 后,就会重复利用它。
transform.DOMoveX(4, 1).SetRecyclable(true);
SetRelative(bool isRelative = true)

如果 isRelative 为 true。endValue 将通过 startValue+endValue 计算得出,而不是直接使用 endValue。
对于 Sequence,会设置其中所有嵌套的 tween 为 relative。
注意:对于已经开始的 tween 没有效果。

transform.DOMoveX(4, 1).SetRelative();
SetUpdate(UpdateType updateType,bool isIndependentUpdate = false)
  • updateType

    UpdateType.Normal - 在每一帧的 Update 函数中更新
    UpdateType.Late - 在每一帧的 LateUpdate 函数中更新
    UpdateType.Fixed - 使用 FixedUpdate 函数来更新
    UpdateType.Manual - 使用 DOTween.ManualUpdate 函数来更新
  • isIndependentUpdate
    如果为 true,tween 就会忽略 unity 的 Time.timeScale
    注意:UpdateType.Fixed 更新类型时,也可以使用 isIndependentUpdate。但是最好不要这样做,因为 timeScale=0 时,FixedUpdate 是不执行的。
transform.DOMoveX(4, 1).SetUpdate(UpdateType.Late, true);
级联回调
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)

Tweener 特定的设置和选项

TweenParams

tween 的控制

有三种方式可以控制一个 tween。这三种方式都有相同的函数名,除了快捷增强方式,这种方式使用的函数名都有 DO 前缀.

第一种方式是通过静态函数

// Pauses all tweens
DOTween.PauseAll();
// Pauses all tweens that have "badoom" as an id
DOTween.Pause("badoom");
// Pauses all tweens that have someTransform as a target
DOTween.Pause(someTransform);

第二种方式是直接通过 tween

myTween.Pause();

第三种方式是通过快捷增强的引用

transform.DOPause();

tween 的控制函数

CompleteAll/Complete(bool withCallbacks = false)

发送终点位置给 tween(对于无限循环的 tween 不起作用)。

  • withCallbacks
    只对 Sequences 起作用。如果 withCallbacks=true,Sequence 内部的回调函数会被触发,否则它们都被忽略。
FlipAll/Flip()

反转 tween 的方向。

GotoAll/Goto(float to,bool andPlay = false)

发送 to 时间点的位置给 tween。

  • to
    如果 to 比 tween 的 duration 还大,则只是到达终点,并不会超出。
  • andPlay
    如果为 true,则 tween 到达 to 时间点后会继续播放,否则就会暂停。
KillAll/Kill(bool complete = true, params object[] idsOrTargetsToExclude)

杀死 tween。默认情况下 tween 执行完后会自动被杀死,除非通过 SetAutoKill(false)函数修改默认设置。

  • complete
    如果为 true,在杀死 tween 之前会立即完成该 tween
  • idsOrTargetsToExclude
    只有 KillAll 有该参数。指定不被杀死的 tween
PauseAll/Pause()

暂停 tween

PlayAll/Play()

播放 tween

PlayBackwardsAll/PlayBackwards()

向后播放 tween

PlayForwardAll/PlayForward()

向前播放 tween

RestartAll/Restart(bool includeDelay = true, float changeDelayTo = -1)

重新开始 tween

  • includeDelay
    如果为 true,则连 tween 的 delay 也会重新开始,否则忽略 delay。
  • changeDelayTo
    设置 tween 的 delay 为该参数值。
RewindAll/Rewind(bool includeDelay)

对 tween 进行倒带

  • includeDelay
    如果为 true,则会倒回 delay 之前。否则忽略 delay
SmoothRewindAll/SmoothRewind

平滑的倒带(不包括 delay)。
平滑地动到 tween 的起始位置(而不是直接跳到起始位置),为了保证动画的流畅性,会忽略所有经过的循环(除了 LoopType.Incremental)
如果在一个正在 delay 的 tween 上调用该函数,只会简单将 delay 设置为 0,并暂停该 tween。

TogglePauseAll/TogglePause()

如果 tween 暂停,就播放它;如果 tween 正在播放,就暂停它。

ForceInit()

强制初始化。当想从一个 tween 中获取数据时,如果该数据只有初始化后才可以获得,那么就可以使用该方法。

GotoWaypoint(int waypointIdx,bool andPlay=false)
  • waypointIdex
    要到达的路径点的索引(如果比最大路径点索引值还大,则只是到达最后一个路径点)
  • andPlay
    如果 true,则到达路径点后,播放 tween,否则就暂停该 tween

参考资料