Unity 动画二:DOTween使用简介

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity 动画二:DOTween使用简介相关的知识,希望对你有一定的参考价值。

参考技术A

上一章对DOTween进行了简单的介绍,了解了其特性以及如何引入项目,下面,我们开始对他的使用,做一个简单介绍,让你对DOTween的用法有个初步的认识。

例子:

DOTween包括一些已知的Unity对象的快捷方式,如Transform,Rigidbody和Material。 您可以从对这些对象的引用直接启动补间(这也将自动将对象本身设置为补间目标)

例子:

无论您选择哪种方式,当创建一个补间时,都会返回一个Tweener或一个Sequence,可以根据实际需要保持这个引用,供之后使用。

因为DOTween有多种写法和引用,所以控制DOTween的方式也有不少选择。

顾名思义,FORM就是“从……来”的意思,即对应的最终值的部分就是变成了“初始值”。

例如:

DOTween可以通过Set方法进行一系列的补间动画实现,通过On来进行回调。

例子:

当您创建补间动画的时候,它通常是自动播放的,直到完成其所有循环内容后才会结束。但是,您可以更改全局属性 defaultAutoPlay 来控制。

当补间动画播放结束之后,通常是自动销毁的。但是,您可以更改全局属性 defaultAutoKill 来控制。

如需要重复使用相同的补间动画,只要将 autoKill 设置为False便可,或者可以在设置补间动画的时候 SetAutoKill(false)

如果您没用使用安全模式,当补间动画实施的目标为空(null)时,可能会发生错误。

如果您可以激活循环重用DOTween缓存,那么您就不必再额外创建新的对象了。

一般建议设置最大Tweener数量为200,最大Sequence数量为50。如果您需要更多功能,DOTween会自动增加两个的数量。但是,您可以直接设置,如下所示:

请访问文档地址: http://dotween.demigiant.com/documentation.php

这里介绍的仅仅是对DOTween最基础的用法,后面将结合项目实际情况给大家分享更多DOTween的实际开发案例教程,敬请期待。

unity DOtween制作连续动画和部分小坑

一、过程简介

这里首先你需要会普通的用代码做Dotween的动画,这里我们只需要学习如何组合起来。

原理:DOtween里面带了一个功能叫做队列,可以连续做动画,需要写代码。

基本过程:

1.它和平时声明其他东西一样,别人是Int i;这个是Sequence sequence;名称也是可以和i一样,可以自己起的。

2.和数组一样,需要先初始化一下,于是就有了sequence = DOTween.Sequence();

3.你需要往里面添加你想要添加的动画。

二、动画添加方式

<一>、普通连续动画(放大图片;缩小图片;再放大图片)

基本逻辑:

1.创建一个队列

2.在队列里按照顺序列出想要连续播放的动画

制作过程:

//先创建一个队列        
Sequence sequence = DOTween.Sequence();
//在队列里按顺序加入想要播放的动画
sequence.Append(_transform.DOScale(new Vector3(1.2f,1.2f,1.2f),0.8f));//放大图片
sequence.Append(_transform.DOScale(new Vector3(1f, 1f, 1f), 0.5f));//缩小图片
sequence.Append(_transform.DOScale(new Vector3(1.2f,1.2f,1.2f),0.8f));//再放大图片

<二>、常用功能(等待、循环播放)

如果说我们动画和动画之间需要等待:

(放大图片;在这等一秒再放下一个;缩小图片;在这等两秒在放下一个;再放大图片)

这个插件也带了一个专用的代码:sequence.AppendInterval();

那么代码将会变成:

//先创建一个队列        
Sequence sequence = DOTween.Sequence();
//在队列里按顺序加入想要播放的动画
sequence.Append(_transform.DOScale(new Vector3(1.2f,1.2f,1.2f),0.8f));//放大图片
sequence.AppendInterval(1);
sequence.Append(_transform.DOScale(new Vector3(1f, 1f, 1f), 0.5f));//缩小图片
sequence.AppendInterval(2);
sequence.Append(_transform.DOScale(new Vector3(1.2f,1.2f,1.2f),0.8f));//再放大图片

如果我们希望这个队列不停地循环播放,我们也可以设置;

//先创建一个队列        
Sequence sequence = DOTween.Sequence();
//在队列里按顺序加入想要播放的动画
sequence.Append(_transform.DOScale(new Vector3(1.2f,1.2f,1.2f),0.8f));//放大图片
sequence.AppendInterval(1);
sequence.Append(_transform.DOScale(new Vector3(1f, 1f, 1f), 0.5f));//缩小图片
sequence.AppendInterval(2);
sequence.Append(_transform.DOScale(new Vector3(1.2f,1.2f,1.2f),0.8f));//再放大图片
//这个队列循环播放
sequence.SetLoops(-1);

<三>、组合使用(等待、循环播放)

技巧:如果我们希望每次播完这一套动画;等5秒再播放下一次

可以在开头或者结尾直接写上等待时间,就可以做到啦。

//先创建一个队列        
Sequence sequence = DOTween.Sequence();
//在队列里按顺序加入想要播放的动画
sequence.Append(_transform.DOScale(new Vector3(1.2f,1.2f,1.2f),0.8f));//放大图片
sequence.AppendInterval(1);
sequence.Append(_transform.DOScale(new Vector3(1f, 1f, 1f), 0.5f));//缩小图片
sequence.AppendInterval(2);
sequence.Append(_transform.DOScale(new Vector3(1.2f,1.2f,1.2f),0.8f));//再放大图片
sequence.AppendInterval(5); //希望等待五秒再重播
//这个队列循环播放
sequence.SetLoops(-1);//这里也可以不写-1,写其他数字就是循环播放几次以后就不播了

三、队列常用方法

<一>、同时进行两个动画

以上的连续动画是第一个放完播放第二个,有时候我们希望两个动画同时播放

方法:sequence.Join()

详细解释:这个代码的意思是和上一个代码一起播放,所以它是上一行开始,它就开始

需求:放大图片的同时,图片消失

//先创建一个队列        
Sequence sequence = DOTween.Sequence();
//在队列里按顺序加入想要播放的动画
sequence.Append(_transform.DOScale(new Vector3(1.2f,1.2f,1.2f),0.8f));//放大图片
sequence.Join(_transform.GetComponent<CanvasGroup>().DOFade(0, 1));   //图片消失

<二>、动画执行到某一步,执行一个方法

这里以按钮为例,经常需要按钮放大、跳转页面、按钮再缩小

分析:“跳到下一个界面”是一个方法,不是一个动画了

总结:队列里放方法的代码为sequence.AppendCallback(方法名称)

详解:下面提供四种写法

如果方法为(纯方法)
void Apple()
//队列为        
Sequence sequence = DOTween.Sequence();
sequence.AppendCallback(Apple);

如果方法为(带了参数)
void Apple(int a)
//队列为
int b = 5;        
Sequence sequence = DOTween.Sequence();
sequence.AppendCallback(()=>Apple(b));

如果方法为(只有一行,想直接写)
Transform c;
c.gameObject.SetActive(false);
//队列为
Sequence sequence = DOTween.Sequence();
sequence.AppendCallback(() => c.gameObject.SetActive(false));

如果方法为(有好多行,但也想直接写)
Transform c;
c.gameObject.SetActive(false);
c.gameObject.SetActive(true);
c.gameObject.SetActive(false);

//队列为
Sequence sequence = DOTween.Sequence();
sequence.AppendCallback(() => 
c.gameObject.SetActive(false);
c.gameObject.SetActive(true);
c.gameObject.SetActive(false););
//这里可以继续往下面加

注:这些方法都是在上一个动画完成才执行的,如果你问,如果希望和动画同时进行怎么办?那你可以把方法放在动画上面,动画用Join。

四、sequence的方法

<一>、常用方法

上面是写好了一个动画,第一步干什么,第二步干什么,下面来控制这个动画。

        sequence.Play();    //动画播放
        sequence.Pause();   //动画暂停
        sequence.Restart(); //动画重播
        sequence.Rewind();   //动画回到开始
        sequence.Kill();     //删除动画

以上等(写的不全)都是可以应用的

但是sequence.AppendCallback,这个里面我们是放的方法,所以,一旦这个方法被执行,是没办法用动画的形式暂停或者停止的这个方法的。

sequence.AppendCallback(() => transform.DOScale(0, 1).SetLoops(-1));

以上例:虽然我写的是一个动画,但是是用方法的形式去写的,那么后面无论你清除,重播还是删除sequence还是对这个队列做其他操作也好,transform.DOScale(0, 1).SetLoops(-1),这个行为是没办法通过sequence消除了。

<二>、使用备注

你创建的动画是默认自动播放的,同时也是默认播放完自动删除上面的动画的,所以如果你希望重复使用的的动画,你就不能让他们把它删了。在创建动画的时候,就要把自动删除这个功能关掉,代码如下。

sequence.SetAutoKill(false);

五、一些小坑

小坑一:

//有时候当fade和scale,放在一起执行时,必须把fade放在前面才行,原因不明
sequence.Append(puzzle_now.GetComponent<CanvasGroup>().DOFade(0, 0.5f));
sequence.Join(puzzle_now.transform.DOScale(new Vector3(2f, 2f, 2f), 0.5f));

小坑二:

//这个代码执行失败
sequence.AppendCallback(() => picNext.GetComponent<Image>().fillOrigin = 1);

小坑三:

用循环时,括号里面不能有太多索引

//这样写就可能失效
for (int i = 0; i < contentsequenceNum; i++)

contentSequence[i].AppendCallback(() => secondaryInterfaceP.GetChild(i).GetComponent<CanvasGroup>().blocksRaycasts = false);
    

//改成下面这样既可
for (int i = 0; i < contentsequenceNum; i++)

Transform tran = secondaryInterfaceP.GetChild(i);
contentSequence[i].AppendCallback(() => tran.GetComponent<CanvasGroup>().blocksRaycasts = false);

以上是关于Unity 动画二:DOTween使用简介的主要内容,如果未能解决你的问题,请参考以下文章

Unity 之 月签到累计签到代码实现(ScriptableObject应用 | DoTween入场动画)

Unity 之 月签到累计签到代码实现(ScriptableObject应用 | DoTween入场动画)

Unity 动画插件 DOTween 的简单使用

Unity常用动画插件DOTween快速上手

Unity常用动画插件DOTween快速上手

[Unity3D] DOTween和Curvy插件,以及UI-Extension