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入场动画)