dotween、iTween的常见使用

514 阅读5分钟

一、前言

unity里面做插值动画的插件有许多,比较常见的有itween、hotween、dotween。根据大家的反馈和实际体验来说,dotween插件在灵活性、稳定性、易用性上都十分突出。这里简单介绍下它的用法,并在后文做了一些效果示例,还是不错的。

二、dotween的常见操作

引用:

using DG.Tweening;

1.物体的移动

参数1:目标位置; 参数2:变化的持续时间 注意:原先坐标位置会改变,如果想在原先坐标基础上移动到目标点,我们需要在最后使用SetRelative()方法

redCube.DOMove(new Vector3(0,4,0), 4);

From():当前物体一开始直接瞬移到目标点,然后从目标点根据持续的时间再次返回一开始的位置

greenCube.DOMove(new Vector3(0,4,0), 4).From();

SetRelative(bool isRelative = true)
其为增量设置,是在原来位置增加其变量

blueCube.DOMove(new Vector3(0,4,0), 4).SetRelative();

SetLoops(int循环,LoopType loopType = LoopType.Restart)
设置循环选项(Restart,Yoyo,Incremental补间)。
设置loops为-1将会使无限循环,为其他数就是循环对应几次 LoopType.Restart: 循环结束时,将从头开始。
LoopType.Yoyo: 从前到后,从后到前的顺序变化 LoopType.Incremental: 每次循环结束时,然后在每个循环周期内增加其值。

purpleCube.DOMove(new Vector3(6,0,0), 2).SetRelative();
purpleCube.GetComponent<Renderer>().material.DOColor(Color.yellow, 2).SetLoops(-1, LoopType.Yoyo);

1.1:实现物体拖拽,另一个物体跟随

拖拽物体:

DragTarget。CS

using UnityEngine;
using System.Collections;

public class DragTarget : MonoBehaviour
{
	Transform t;
	Camera mainCam;
	Vector3 offset;

	void Start()
	{
		t = this.transform;
		mainCam = Camera.main;
	}
	/// <summary>
	/// 鼠标按下触发的事件
	/// </summary>
	void OnMouseDown()
	{
		print("鼠标按下");
		//获取鼠标点击时候的坐标
		Vector2 mousePos = Input.mousePosition;
        //从世界空间到屏幕空间变换位置
        float distance = mainCam.WorldToScreenPoint(t.position).z;
        //从屏幕空间到世界空间的变化位置
        Vector3 worldPos = mainCam.ScreenToWorldPoint(new Vector3(mousePos.x, mousePos.y, distance));
		//计算两个物体之间的距离差
		offset = t.position - worldPos;
	}
	/// <summary>
	/// 鼠标拖拽触发的事件
	/// </summary>
	void OnMouseDrag()
	{
		Vector2 mousePos = Input.mousePosition;
		float distance = mainCam.WorldToScreenPoint(t.position).z;
 		t.position = mainCam.ScreenToWorldPoint(new Vector3(mousePos.x, mousePos.y, distance)) + offset;
	}
}

跟随物体:

Follow。CS

using UnityEngine;
using System.Collections;
using DG.Tweening;

public class Follow : MonoBehaviour
{
	public Transform target; // Target to follow
	Vector3 targetLastPos;
	Tweener tween;

	void Start()
	{
		tween = transform.DOMove(target.position, 2).SetAutoKill(false);//SetAutoKill():设置自动杀死动画
		targetLastPos = target.position;
	}

	void Update()
	{
		if (targetLastPos == target.position) return;
		tween.ChangeEndValue(target.position, 1, true).Restart();
        targetLastPos = target.position;
    }
}

2.物体的颜色改变

参数1:目标颜色; 参数2:变化的持续时间

Color colorTarget = new Color(1,1,1,settings.fadeColorAlpha);
spriteRender.DOColor(colorTarget,settings.fadeColorDuration);

3.总结:

3.1、Set设置参数

Unity中添加一个Cube,并挂载这个脚本

SetLoops():设置循环

//参数1.循环次数(-1表示无限循环)

//参数2.循环方式

//Yoyo:来回运动

//Restart:重新开始(运动完马上返回原来状态再接着运动)

//Incremental:一直朝着一个方向运动

transform.DOMove(Vector3.one, 2).SetLoops(-1,LoopType.Yoyo);

SetAutoKill():设置自动杀死动画

transform.DOMove(Vector3.one, 2).SetAutoKill(true);

From():反向

//from(反向运动,从目标点运动回起始点)

//true为增量运动,false则为目标值运动。无参默认为目标值运动

transform.DOMove(Vector3.one, 2).From(true);

SetDelay():设置延时执行

transform.DOMove(Vector3.one, 2).SetDelay(2);

SetSpeedBased():设置动画以速度为基准

//参数2.原本表示持续时间的参数,就变为了每秒的速度

transform.DOMove(Vector3.one*5, 2).SetSpeedBased();

SetRelative():设置为增量运动

transform.DOMove(Vector3.one * 5, 2).SetRelative(true);

SetId():设置动画ID

//设置ID,可以用于之后再调用

transform.DOMove(Vector3.one * 5, 2).SetId("id");

DOTween.Play("id");

SetRecyclable():设置动画是否可回收

//设置是否可回收

//为true的话,动画播放完会被回收,缓存下来,不然播完就直接销毁

transform.DOMove(Vector3.one * 5, 2).SetRecyclable(true);

SetUpdate():设置动画的帧函数

//设置动画的帧函数

//第一个参数 UpdateType :选择使用的帧函数

//UpdateType.Normal:更新每一帧中更新要求。

//UpdateType.Late:在LateUpdate调用期间更新每一帧。

//UpdateType.Fixed:使用FixedUpdate调用进行更新。

//UpdateType.Manual:通过手动DOTween.ManualUpdate调用进行更新。

//第二个参数:为TRUE,则补间将忽略Unity的Time.timeScale

transform.DOMove(Vector3.one * 5, 2).SetUpdate(UpdateType.Fixed);

3.2、Ease曲线

Unity中添加一个Cube,并挂载这个脚本

SetEase():设置曲线

点击这里查看Ease的各种枚举类型的效果动画

//参数1 Ease的各种枚举类型

//参数2 Amplitude(振幅):就是移动次数,起始点移动到目标算移动一次,再移动回来移动两次

//参数3 period 值的范围是 -1~1

//值 > 0时,为活动范围的衰减值,活动范围会由大变小

//值 = 0时,就是均匀的在起始坐标和目标坐标之间运动

//值 < 0时,会施加一个向目标坐标的一个力,活动范围一点点增大,最后逼近目标点

//这两个参数只对Flash, InFlash, OutFlash, InOutFlash这四种曲线有用,其他的曲线起作用的就只有Ease枚举参数

transform.DOMove(Vector3.one * 5, 2).SetEase(Ease.InBack,3,0);

Animation设置曲线:

public AnimationCurve curve;

private void Start()

{

        transform.DOMove(Vector3.one * 2, 1).SetEase(curve);

        //AnimationCurve 横轴是时间, 不过不是具体的时间,而是时间比例

        //AnimationCurve 纵轴是倍数

        //假设纵轴的值为v,传入DOMove的第一个参数endValue是e,起始点坐标是s

        //此物体最后动画结束时的实际坐标即为 v * (e - s)+s

}

以回调函数为参数:

private void Start()

{

    transform.DOMove(Vector3.one * 5, 2).SetEase(EaseFun);

}

//返回值是运动距离的百分比 值应为0~1之间,最后的值需为1,不然停留的位置不会是目标位置

private float EaseFun(float time, float duration, float overshootOrAmplitude, float period)

{

    return time / duration;

}

3.3、回调函数

Unity中添加一个Cube,并挂载这个脚本

1.动画完成回调

transform.DOMove(Vector3.one, 2).OnComplete(() => { });

2.完成单个循环周期时触发

transform.DOMove(Vector3.one, 2).OnStepComplete(() => { });

3.动画被杀死时回调

transform.DOMove(Vector3.one, 2).OnKill(() => { });

4.动画播放时回调,暂停后重新播放也会调用

transform.DOMove(Vector3.one, 3).OnPlay(() => { });

5.只在第一次播放动画时调用,在play之前调用

transform.DOMove(Vector3.one, 2).OnStart(() => { });

6.动画暂停时回调

transform.DOMove(Vector3.one, 2).OnPause(() => { });

7.动画回退时回调

//以下情况会被调用

//使用DORestart重新播放时

//使用Rewind倒播动画完成时

//使用DOFlip翻转动画完成时

//使用DOPlayBackwards反向播放动画完成时

transform.DOMove(Vector3.one, 2).OnRewind(() => { });

8.帧回调

transform.DOMove(Vector3.one, 2).OnUpdate(() => { });

9.在路径动画时,改变目标点时的回调,参数为当前目标点的下标

transform.DOMove(Vector3.one, 2).OnWaypointChange((value) => { });

10.sequence回调

Sequence sequence = DOTween.Sequence();
sequence.Append(purpleCube.GetComponent<Renderer>().material.DOColor(Color.yellow, 2).SetLoops(-1, LoopType.Incremental));
        sequence.AppendCallback(() =>
        {
            print("我现在变完颜色了");
        });

11.sequence.Insert()

sequence.Insert(0,purpleCube.transform.DOScale(new Vector3(0.5f, 0.5f, 0.5f), 2));

回调:

sequence.Insert(0,purpleCube.transform.DOScale(new Vector3(0.5f, 0.5f, 0.5f), 2));
		sequence.InsertCallback(1,InsertCallBack);
                
   private void InsertCallBack()
    {
		print("大小改变完了");
    }

12.Join(Tween tween)

在Sequence的最后一个tween的开始处放置一个tween。

13.Prepend(Tween tween)

在Sequence开始处插入一个tween,原先的内容根据时间往后移。

PrependCallback(TweenCallback callback)

PrependInterval(float interval)

在Sequence开始处插入一段时间间隔,原先的内容根据时间往后移。

3.4、动画控制函数

Unity中添加一个Cube,并挂载这个脚本

1.播放

transform.DOPlay();

2.暂停

transform.DOPause();

3.重播

transform.DORestart();

4.倒播,此方法会直接退回起始点

transform.DORewind();

5.平滑倒播,此方法会按照之前的运动方式从当前位置退回起始点

transform.DOSmoothRewind();

6.杀死动画

transform.DOKill();

7.翻转补间的方向和Rewind效果有点像

transform.DOFlip();

8.跳转时间点

//第一个参数跳转的时间点,第二个参数是跳转后是否播放动画

transform.DOGoto(1.5f, true);

9.反向播放动画

//反向播放动画,在动画播放到一半时执行,会退回起始点,在一开始执行看不到效果是因为,物体本身就在起始点

transform.DOPlayBackwards();

10.正向播放动画

transform.DOPlayForward();

11.TogglePause

//当暂停时,执行就继续播放,播放时,执行就暂停

transform.DOTogglePause();

4.Squence

Sequence sequence = DOTween.Sequence();
		//添加一个移动到sequence中
		sequence.Append(purpleCube.DOMove(new Vector3(6, 0, 0), 2).SetRelative());
		sequence.AppendCallback(() =>
		{
			print("我现在移动完了");
		});
		sequence.Append(purpleCube.GetComponent<Renderer>().material.DOColor(Color.yellow, 2).SetLoops(-1, LoopType.Incremental));
        sequence.AppendCallback(() =>
        {
            print("我现在变完颜色了");
        });

        //如果是单个操作的话,我们直接移动,不需要append
        /*purpleCube.GetComponent<Renderer>().material.DOColor(Color.yellow, 2).SetLoops(-1, LoopType.Incremental).onComplete(
		() =>
		{
			print("完成了改变颜色");
		}	
			
		);*/