Unity 插件 DOTween 使用方法
项目开发中经常会有一些简单的动画需求
1.旋转
2.N秒从一个位置移动到某个位置,两点之间来回移动
3.比例缩放,果冻效果
4.改变颜色
5.队列顺序执行动画
等等动画需求
以上各种动画设置循环、延迟时间、执行次数、速率变化(各种缓动曲线效果)、执行完成回调、重新播放、暂停、取消等等
下载 DoTween插件
1.解压下载的插件,导入到Unity 中,安装DoTween,菜单栏 Tools->Demigiant->DoTween Utility Panel
弹出如下界面
点击 Setup DOTween… 按钮
下方按钮:Website、Documentation、Changelog 等按钮点击可以打开 DoTween 网站,查看说明文档、版本变化等
2.多选栏:Preferences 根据自己的需求设置
代码使用如下
创建一个 Tween 从自身坐标 一秒内 移动到 坐标 Vector3(5, 5, 5) 位置,并添加移动完成回调
Tween tween = DOTween.To(() => transform.position, r => transform.position = r, new Vector3(5, 5, 5), 1);
// 移动完成回调
tween.onComplete += ()=> {
Debug.LogError("Complete");
};
创建一个 Tween 对象, 另 number的值在 5 秒内变化到 100,每帧执行回调
int number = 0;
Tween tween = DOTween.To(() => number, x => number = x, 100, 5);
// 添加每帧的回调,在
tween.OnUpdate(() => Debug.LogError(number));
通过 transform 创建动画
5 秒内X,Y,Z 局部坐标(localPosition)移动到 10,10,10 位置
transform.DOBlendableLocalMoveBy(new Vector3(10, 10, 10), 5);
10 秒内 X,Y,Z 方向的局部旋转(localPosition),转动到 30,30,30
transform.DOBlendableLocalRotateBy(new Vector3(30, 30, 30), 10);
十秒内X,Y,Z坐标移动到 自身坐标 加 (10,10,10) 位置, 原始 坐标 (3,3,3),移动后 坐标(13,13,13)
transform.DOBlendableMoveBy(new Vector3(10, 10, 10), 10);
5秒内 自身X,Y,Z 的比例 加 (3, 2, 1) 如原始比例 (5, 6, 7) 变化后 (8, 8, 8)
transform.DOBlendableScaleBy(new Vector3(3, 2, 1), 5);
//在动画执行过程中调用 DOComplete方法,则动画立即执行结束,并将最终结果 (8, 8, 8) 赋值给 transform
transform.DOComplete();
//在动画执行过程中调用 DOFlip 方法,则物体慢慢的变回原样,如果动画已经执行完成,该方法无效
transform.DOFlip();
//在动画执行过程中调用 DOPlayBackwards方法,则物体慢慢的变回原样,如果动画已经执行完成,该方法无效
transform.DOPlayBackwards();
//当执行过 DOPlayBackwards 后,再执行 DOPlayForward,则动画继续向最终目标变化
transform.DOPlayForward();
十秒从当前位置,分 3 次跳跃,跳跃力度为5,最终落地坐标为 (10, 10, 10)
Vector3 endValue = new Vector3(10, 10, 10);
float jumpPower = 5; // 决定每次跳跃的速率和高度,值越大,每次跳跃速度越快,高度越高
int numJumps = 3;
float duration = 10;
// 调用 DOJump 最终结果为世界坐标 transform.position = (10, 10, 10)
transform.DOJump(endValue, jumpPower, numJumps, duration);
// 调用 DOLocalJump 最终给结果为相对父节点坐标 transform.localPosition = = (10, 10, 10)
transform.DOLocalJump(endValue, jumpPower, numJumps, duration);
当动画正在执行时调用 DOKill,动画立即停止
transform.DOKill();
5 秒内, 局部坐标变化到 (10, 10, 10)
transform.DOLocalMove(new Vector3(10, 10, 10), 5);
3 秒内 X 局部坐标变换到 5
transform.DOLocalMoveX(5, 3);
5 秒内 局部旋转变化到 10,10, 10
transform.DOLocalRotate(new Vector3(10, 10, 10), 5);
5秒内将自身朝向改变为朝向 坐标(10,10,10)
transform.DOLookAt(new Vector3(10, 10, 10), 5);
5 秒内 移动到 世界坐标 transform.position =(10,10,10)
transform.DOMove(new Vector3(10, 10, 10), 5);
10 秒内 X 世界坐标 transform.position.x = 5
transform.DOMoveX(5, 10);
执行动画时调用 DOPause,动画停止
transform.DOPause();
执行动画时调用 DOPlay,动画继续
transform.DOPlay();
5 秒内在 当前坐标 和 坐标 (10, 10, 10) 之间,来回往复移动
transform.DOPunchPosition(new Vector3(10, 10, 10), 5);
5 秒内在 当前旋转 和 欧拉角旋转(50, 50, 50)之间,来回往复变化旋转
transform.DOPunchRotation(new Vector3(50, 50, 50), 5);
5 秒内在当前缩放比例 和 缩放(5, 5, 5)比例之间,来回往复变化缩放比例
transform.DOPunchScale(new Vector3(5, 5, 5), 5);
在动画结束之前,执行 DORestart 方法,则动画重新开始
transform.DORestart();
动画执行过程中执行 DORewind 方法,所有变化复原会原样
transform.DORewind();
5 秒内 欧拉角旋转角度 (50,50,50)
transform.DORotate(new Vector3(50, 50, 50), 5);
10 秒内 缩放比例比例变化到 (5,5,5)
transform.DOScale(new Vector3(5, 5, 5), 5);
10 秒内 X 比例变化到 5
transform.DOScaleX(5, 10);
10 秒内 物体 X,Y,Z 坐标在当前坐标和 坐标(10, 10, 10) 空间内震荡移动
transform.DOShakePosition(10, new Vector3(10, 10, 10));
10 秒内, 物体 X,Y,Z 旋转角度在 当前欧拉角旋转 到 (10, 10, 10) 之间震荡旋转
transform.DOShakeRotation(10, new Vector3(10, 10, 10));
10 秒内, 物体 X,Y,Z 缩放比例在当前缩放 到 缩放 (10, 10, 10) 之间震荡变化
transform.DOShakeScale(10, new Vector3(10, 10, 10));
执行DOMove方法,坐标立即变化为 (0, 5, 0), 并从 (0, 5, 0) 坐标,两秒移动到初始位置
transform.DOMove(new Vector3 2).From();
移动到相对于当前位置 (6, 0, 2) 的位置
如原始位置 (3, 2, 1), 移动后位置为 (3+6, 0+2, 2+1) 即 (9, 2, 3)
transform.DOMove(new Vector3(6, 0, 2), 2).SetRelative();
添加事件回调方法
// 创建一个 Tweener 对象, 另 number的值在 2 秒内变化到 100
Tween t = DOTween.To(() => number, x => number = x, 100, 2);
// 添加各种事件的回调方法
t.OnStart(OnStartTween).OnKill(OnKill).OnPause(OnPause).OnPlay(OnPlay).OnRewind(OnRewind);
t.OnStepComplete(OnStepComplete).OnUpdate(UpdateTweenEd).OnComplete(OnComplete);
// 带参数的回调方法如下
t.OnUpdate(() => UpdateTweenED(number));
设置循环类型、缓动类型
Vector3 pos = Vector3.zero;
// 设置了循环类型 LoopType.Yoyo 和缓冲类型 Ease.InOutCirc
Tween tween = DOTween.To(() => pos, r => pos = r, new Vector3(5, 5, 5), 1).SetLoops(-1, LoopType.Yoyo).SetEase(Ease.InOutCirc);
//复制一个 Tween 对象的 id, ease, loops, delay, timeScale, callbacks, etc 到另一个 Tween 对象
// t 复制 tween 的循环类型和缓冲类型
Tween t = DOTween.To(() => transform.position, r => transform.position = r, new Vector3(15, 15, 15), 2).SetAs(tween);
// SetAutoKill 设置自动销毁
// SetDelay 设置延迟
// SetEase 设置缓冲类型
// SetId 设置ID 可以只用 int、string、object等类型的值
// SetLoops 设置循环类型
// SetRecyclable 设置为可回收,可循环使用的
// SetRelative 设置相对变化
// SetSpeedBased
// SetTarget
// 设置 Update 的值 告诉 Tween对象 是否忽视 Unity的 的 timeScale ,即是否受Unity 时间的影响
// SetUpdate(UpdateType.Normal, true) 设置为 true 为忽视 Unity的时间影响
// 设置为 false 为不忽视Unity的时间影响
// SetUpdate
transform.DOMoveX(20, 5).SetAutoKill(true).SetDelay(3).SetEase(Ease.InOutCirc)
.SetId("superTween").SetLoops(-1, LoopType.Yoyo).SetRecyclable()
.SetRelative().SetSpeedBased().SetTarget(transform).SetUpdate(UpdateType.Normal, true);
动画队列,创建一个动画队列,可以添加多个动画,一个动画执行结束后,执行下一个,知道最后一个执行结束
Sequence s = DOTween.Sequence();
// 添加 一个相对于原始位置 水平方向移动, 时间 3 秒,缓冲类型 为 Ease.InOutQuad
s.Append(transform.DOMoveX(6, 3).SetRelative().SetEase(Ease.InOutQuad));
//插入一个旋转, 设置循环类型为 来去 方式
// and will loop forward and backward twice
s.Append(transform.DORotate(new Vector3(0, 45, 0), 2).SetEase(Ease.InQuad).SetLoops(2, LoopType.Yoyo));
// Add a color tween that will start at half the duration and last until the end
s.Append(transform.GetComponent<Renderer>().material.DOColor(Color.yellow, 5));
设置 Text 的跑马字,一秒显示 N 个字
text = GetComponent<Text>();
// Animate the first text...
text.DOText("This text will replace the existing one", 2).SetEase(Ease.Linear).SetAutoKill(false).Pause();
relativeText = GetComponent<Text>();
// Animate the second (relative) text...
relativeText.DOText(" - This text will be added to the existing one", 2).SetRelative().SetEase(Ease.Linear).SetAutoKill(false).Pause();
scrambledText = GetComponent<Text>();
// Animate the third (scrambled) text...
scrambledText.DOText("This text will appear from scrambled chars", 2, true).SetEase(Ease.Linear).SetAutoKill(false).Pause();
开始所有 Tween 对象
DOTween.PlayAll();
所有 Tween对象 从新开始
DOTween.RestartAll();