当前位置:   article > 正文

【Unity好插件介绍】介绍DOTween以及其常用函数属性介绍_dotween修改透明度

dotween修改透明度

 

学习目标:

今天来介绍一下Unity的一个好插件DOTween,也就当复习巩固了,没想到在B站上看到了一个远古视频有老师教学怎么使用DOTween,于是在学习了42P视频后就讲学到的常用函数属性给大伙看一遍。

如果你想系统性的学习请看:Unity常用插件之DoTween_哔哩哔哩_bilibili详细了讲解了Unity中的常用插件DoTween的使用方法。https://www.bilibili.com/video/BV1Fx411Z7Bi?spm_id_from=333.851.header_right.fav_list.click

如果有懂哥的话肯定知道这个插件大致就是通过代码控制住动画,让游戏运行的时候能进行相应的动画,下列是公司说的优点

然后我们在Asset Store下载一个免费版的,然后倒入到Unity中

右下角Import一下,

导入成功后就会看到这个绿色按钮点一下等一会Apply成功后即可退出,DOTween插件成功导入。然后我们还可以在代码中引用它的命名空间了。

准备好了话就先创建一个3D 的项目,然后开始每个方法都要实践吧。

学习内容:

  红色注意:要使用它的命名空间要在一开始的using下添加命名空间using DG.Tweening;

 除非特殊说明,不然所有代码都是在Untiy自带的Start()函数上完成的。

  一:首先从移动和旋转,大小开始

  1. //transform.DOMove(Vet3目标点,float时长)
  2. //transform.DOMove(Vector3.one, 2f);
  3. //transform.DOMoveX() //移动x轴
  4. //transform.DOLocalMove() Unity中有自身坐标(相对)以及世界坐标(绝对)

还有另一种Punch的可以让你的移动反复(一般震动和弹性都是用默认的)

  1. //DOPunchPosition反复开始和结尾的位置
  2. //transform.DOPunchPosition(new Vector3(0, 1, 0),2f,3,0.1f); //Vet3 时间 震动 弹性
  1. //DORotate(Vet3目标度数,float时长)
  2. //transform.DORotate(new Vector3(50, 50, 50), 2f);
  1. //DOScale(Vet3目标大小,float时长)
  2. //transform.DOScale(new Vector3(2, 2, 2), 2f);

然后还有一个震动的

  1. //震动的时长,强度,频率,随机的角度
  2. //transform.DOShakePosition(2f, 4, 10, 90);

二丶材质部分

  我们还可以用于修改材质

  首先创建一个3D Object 叫Cube,然后创建一个Material,再将照片给它

 可以见到我们两种Shader都用的不一样的

 如果我们用Patricals的,则啊草图片是显示不出来的。

下面是Standard

扯的有点远了,首先我们用回第一张图的Shader,然后我们开始介绍代码

  1. //材质
  2. Material material = GetComponent<MeshRenderer>().material;
  3. //DOColor(Color你想要改变的颜色,把颜色赋值给Shader属性的Color(默认"_Color",看你用的是什么shader了),时长)
  4. //material.DOColor(Color.red,"_TintColor", 2);

 那么这个_TintColor在哪里看呢?就在你的材质里,找到Color的名字后复制粘贴进去,不然会报错的(Standard则没有这种问题)点击Edit,可以看到它的属性

  1. //修改透明度第一方法:DOColor()将颜色清零
  2. //material.DOColor(Color.clear, "_TintColor", 2f);

  1. //修改透明度第二方法:DOFade(Float Fade你想要改变的透明度大小,把颜色赋值给Shader属性的Color(默认"_Color",看你用的是什么shader了),时长)
  2. //material.DOFade(0, "_TintColor", 2f);

如果要修改颜色的渐变值,首先我们要在回调函数外声明一个Grandient类

public Gradient gradient;//渐变

  1. //渐变颜色DOGradientColor(Gradient 要渐变的,指定的属性, float时长)
  2. //material.DOGradientColor(gradient, "_TintColor", 2);

材料的纹理坐标指的是Offset

 可以改变它的Offset让Material有个滚动的效果

  1. //纹理偏移值DOOffset(Vec2 Offset,float 时长)
  2. //material.DOOffset(new Vector2(1, 1), 2);

我们还有一个混合模式,如果你只是单纯的列两条函数,那它只会执行后一条

  1. //这两行最终执行结果也只是变为绿色
  2. //material.DOColor(Color.red,"_TintColor", 2);
  3. //material.DOColor(Color.green, "_TintColor", 2);

但你用了混合模式就不一样了,它会选择两种颜色的中间色

  1. //材质的混合模式
  2. material.DOBlendableColor(Color.red, "_TintColor", 2);
  3. material.DOBlendableColor(Color.green, "_TintColor", 2);

三丶摄像机属性相关的动画

再声明一遍,如果你想要使用这些扩展函数的话,一定要引用命名空间using DG.Tweening;

首先我们创建一个脚本挂载到摄像机上,再获取Camera组件,

Camera cam = GetComponent<Camera>();

  1. //设置摄像机宽高比cam.DOAspect(float 宽高比值,float 时长)
  2. //cam.DOAspect(1.5f, 2);

  1. //设置摄像机的背景颜色(Color 你要变换的颜色,float 时长)
  2. //cam.DOColor(Color.red, 2f);

  1. //设置摄像机的近切面和远切面(Clipping Plane)Near,Far
  2. //cam.DONearClipPlane(1.4f, 2f);
  3. //cam.DOFarClipPlane(5f, 2f);

点开摄像机其实是这里

  1. //设置Perspective摄像机的视域Fiew of View
  2. //DOFieldOfView(float size,float 时长)
  3. //cam.DOFieldOfView(100f, 2f);
  4. //cam.DOOrthoSize()调整正交摄像机otherographic的视域大小
  5. //cam.DOOrthoSize(6f, 2f);

这里涉及到摄像机的两种透视模式

  1. //设置摄像机在屏幕的比例cam.DORect(Rect 矩形,float时长)
  2. //cam.DORect(new Rect(0, 0, 0.5f, 0.5f),2f);
  1. //根据像素设置摄像机在屏幕的比例
  2. cam.DOPixelRect(new Rect(0, 0, 512, 384), 2f);

这里则是摄像机能在屏幕上显示的比例(一种是多少比例,一种是多少个像素)

 我用的是1024:768个像素比

 设置摄像机抖动这个是最常见的:

  1. //设置相机的震动(float时长,float 强度,int 频率,float 随机度数)
  2. cam.DOShakePosition(2);

四丶UI部分

可以看到这个DOTween真的已经覆盖了Unity组件的大部分。

首先是Text我们可以让Text像打字机一样输出文字,后面的SetEase()函数表示我们可以使用什么类型的模式来输出,每一种大伙都可以试一下

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5. using DG.Tweening;
  6. public class TextDOTween : MonoBehaviour
  7. {
  8. void Start()
  9. {
  10. Text text = GetComponent<Text>();
  11. //text.DOText(string,float).SetEase(样式)
  12. text.DOText("abcdefghijklmnopqrstuvwxyz", 5f).SetEase(Ease.Linear);
  13. }
  14. }

同样,我们也可以用在Button上

这里简单写一点了,比如直接创建一个脚本然后挂载在一个新建的Button上,当触发点击事件的时候回进行反复移动

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5. using DG.Tweening;
  6. public class ButtonDOTween : MonoBehaviour
  7. {
  8. // Start is called before the first frame update
  9. void Start()
  10. {
  11. }
  12. // Update is called once per frame
  13. void Update()
  14. {
  15. }
  16. public void aniBtn()
  17. {
  18. transform.DOPunchPosition(new Vector3(0, 20, 0), 0.4f,6,0.3f);
  19. transform.DOPunchScale(new Vector3(0.3f, 0, 0), 0.3f, 4, 0.4f);
  20. }
  21. }

截的不是很好,但可以看出按钮已经播放动画了。

 五丶(核心部分)运动序列

  之所以我称呼他为核心部分,是因为它可以为某个动画添加各种一样行为,顺序逆序

首先我们先创建一个运动队列

运动队列本身就是一个队列,它所创建的所有序列都遵循队列的先进先出的顺序

Sequence sequence = DOTween.Sequence();
  1. sequence.Append(transform.DOMove(Vector3.one, 2f));//0-2
  2. //在上一个动作的基础上再加一个动作Join(Tween 动作)

  1. //插入在某一时刻插入某个动作Insert(flaot 时刻,Tween 动作)
  2. //sequence.Insert(0, transform.DOMove(-Vector3.one, 1.5f)); //从第0秒开始,就把一开始的Apeend给替换掉了

  1. sequence.InsertCallback(2, appCallBack);
  2. private void appCallBack()
  3. {
  4. Debug.Log("InsertCallBack");
  5. }
 sequence.Join(transform.DOScale(Vector3.one * 2, 2f));
  1. //下列这两步和上面的Join一样
  2. //sequence.Insert(0f, transform.DOScale(Vector3.one * 2, 2f));
  3. //sequence.Insert(3f, transform.DOScale(Vector3.one, 2f));
  1. //sequence.AppendCallback(); 回调函数
  2. //我们现在Start()外面创建一个函数
  3. private void appendCallBack()
  4. {
  5. Debug.Log("AppendCallBack");
  6. }
  7. 然后就可以调用它了
  8. sequence.AppendCallback(appendCallBack);

接下来介绍反过来的添加动作Prepend预添加Prepend则是一个栈 后进先出的

执行的顺序是先执行Prepend,再执行Append

  1. sequence.PrependInterval(1f); //等待一秒
  2. sequence.Prepend(transform.DOMove(-Vector3.one, 2f)); //先反方向
  3. sequence.PrependCallback(prependCallBack);
  4. private void prependCallBack()
  5. {
  6. Debug.Log("PrependCallBack");
  7. }

这些是先执行的。

六丶运动参数TweenParams

  也是挺重要的,标记为紫色。

  首先要创建一个对象

TweenParams tp = new TweenParams();

然后是设置循环,第一个参数是循环的次数(如果是-1则代表无限循环,后面是循环的类型有Yoyo,Restart等)

  1. TweenParams tp = new TweenParams();
  2. //tp.SetLoops(-1, LoopType.Yoyo);

给一个动作赋予参数(通常bool值为false)

  1. //transform.DOMove((Vector3.one), 1f).SetAs(tp).SetAutoKill(); //SetAutoKill()动作完成时自动销毁
  2. //transform.DOMove((Vector3.one), 1f).From(true); //From(bool 基于方向进行移动,如果两个点重合的话,如果设置为true 即使两个点重合还会根据方向移动过来,如果都是(1,1,1)),他会从
  1. //设置延迟参数
  2. //transform.DOMove(Vector3.one, 1).SetDelay(3f);
  3. //设置速度(DOMove里面的数字10就是速度)
  4. //transform.DOMove(Vector3.one, 10).SetSpeedBased(true); //SetSpeedBased(bool true则是速度,false则是时间)

 通过ID来编号你要执行的动作

  1. //设置 SetId(string ID名字)
  2. //transform.DOMove(Vector3.one, 2f).SetId("ID03");
  3. //DOTween.Play("ID03");
  1. //设置可回收的
  2. //transform.DOMove(Vector3.one, 2f).SetRecyclable();
  3. //设置增量的使用
  4. //transform.DOMove(Vector3.one, 2f).SetRelative();
  1. //SetUpdate(UpdateType Upadte的类型Normal则是通常的,bool 播放的时间帧值true则不受Time.scaletime控制)
  2. //transform.DOMove(Vector3.one, 2f).SetUpdate(UpdateType.Normal,true);
  1. //Linear匀速 Flash闪动 float 10速度的变换
  2. //transform.DOMove(Vector3.one, 2f).SetEase(Ease.Linear,10,0);

自定义曲线,首先要在开头声明一个

public AnimationCurve ac;

可以看到在Inspector面板上我们点击后可以选择你的曲线,也可以通过鼠标右键点击Add Key来添加属性让曲线呈现你想要的。

  1. //自定义曲线Easer、
  2. //transform.DOMove(Vector3.one, 2).SetEase(ac);

你也可以自定义一个函数来绘制曲线

  1. //自定义函数型曲线
  2. //transform.DOMove(Vector3.one, 2).SetEase(MyEaseRun);
  3. private float MyEaseRun(float time, float duration, float overshootOrAmplitude, float period)
  4. {
  5. return time / duration;
  6. }

八丶回调函数

  DOTween上的回调函数同样也是非常重要的内容。

 例如我们可以用Lamada表达式来创造动作完成时候的回调

  1. //Lamada表达式OnComplete
  2. //transform.DOMove(Vector3.one, 2f).OnComplete(() => { Debug.Log("kkjjj"); });

除此之外还有其他的,与Unity的MonoBehavior自带的回调函数相似知识在前面加了个on

还有一个输出动作的时间点fullPosition这里以异步为例

接下来介绍fullPosition,这里引用异步函数,首先先声明两个命名空间

using System;
using System.Threading.Tasks;

  1. async void Start()
  2. {
  3. var tweener = transform.DOMove(Vector3.one, 2f);
  4. await Task.Delay(TimeSpan.FromSeconds(1));
  5. //tweener.fullPosition = 2; //如果是2,则表示暂停线程1秒后直接到达2秒的位置
  6. Debug.Log(tweener.fullPosition); //返回的是当前位置是在总时间的第几秒
  7. //动画的时间时刻tweener.fullPosition;
  8. }

可以看到它通过当前位置计算出方块的位置相当于总时间的多少秒

等我们把注释解掉,仅有一秒就运行到本来动画2秒就要运行到的位置


  1. //var tweener = transform.DOMove(Vector3.one, 1f).SetLoops(3);
  2. //获取有多少个暂停动画tweener.Delay();
  3. //执行的时间tweener.Duration(bool 是否包含循环) false则是总时长(1),true则要乘以循环次数(1*3);
  4. //已经执行完成的时间tweener.Elapsed(bool 是否包含循环) false则是总时长(1),true则要乘以循环次数(1 * 3));
  5. //动画的播放进度[0,1]tweener.ElapsedDirectionalPercentage()
  6. //tweener.ElapsedPercentage(bool); //也有判断是否包含循环
  1. //可以看是否包括循环,如果是则返回整体循环的百分比 tweener.ElapsedPercentage(bool);
  2. //返回循环次数tweener.Loops();
  3. //await Task.Delay(TimeSpan.FromSeconds(1));
  4. //Debug.Log(tweener.CompletedLoops());
  5. //await Task.Delay(TimeSpan.FromSeconds(1));
  6. //Debug.Log(tweener.CompletedLoops());
  7. //await Task.Delay(TimeSpan.FromSeconds(1));
  8. //Debug.Log(tweener.CompletedLoops());
  1. //transform.DORestart();
  2. //transform.DORewind(); //重新回到开始位置
  3. //transform.DOSmoothRewind();// 平滑的重新回到开始位置
  4. //transform.DOPause(); //暂停
  5. //transform.DOPlay(); //播放
  6. //transform.DORestart(); //重新开始
  7. //await Task.Delay(TimeSpan.FromSeconds(1)); //延迟人物,把秒转化为毫秒TimeSpan.FromSeconds
  8. //transform.DORewind(); //回到开始的位置
  9. //transform.DOSmoothRewind();
  10. //transform.DOFlip();
  11. //transform.DOGoto(1,true); //float跳到那个时间点,bool 是否继续播放
  12. //transform.DOPlayForward();
  13. //transform.DOPlayBackwards();
  14. //transform.DOTogglePause(); //暂停一瞬间感觉没什么用
  15. //await Task.Delay(TimeSpan.FromSeconds(1));
  16. //transform.DOTogglePause();

九丶类方法

  用于统筹你的之前创造的动画动作等。

  1. //transform.DORestart();
  2. //transform.DORewind(); //重新回到开始位置
  3. //transform.DOSmoothRewind();// 平滑的重新回到开始位置
  4. //transform.DOPause(); //暂停
  5. //transform.DOPlay(); //播放
  6. //transform.DORestart(); //重新开始
  7. //await Task.Delay(TimeSpan.FromSeconds(1)); //延迟人物,把秒转化为毫秒TimeSpan.FromSeconds
  8. //transform.DORewind(); //回到开始的位置
  9. //transform.DOSmoothRewind();
  10. //transform.DOFlip();
  11. //transform.DOGoto(1,true); //float跳到那个时间点,bool 是否继续播放
  12. //transform.DOPlayForward();
  13. //transform.DOPlayBackwards();
  14. //transform.DOTogglePause(); //暂停一瞬间感觉没什么用
  15. //await Task.Delay(TimeSpan.FromSeconds(1));
  16. //transform.DOTogglePause();

十丶协程

  协程与进程不同,一个应用程序一般对应一个进程,一个进程一般有一个主线程,还有若干个辅助线程,线程之间是平行运行的,在线程里面可以开启协程,让程序在特定的时间内运行。(引用文章:unity 协程原理与线程的区别_天涯过客TYGK的博客-CSDN博客_协程与线程的区别https://blog.csdn.net/u011484013/article/details/51136780?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165209865816782246448450%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=165209865816782246448450&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-51136780-null-null.142%5Ev9%5Econtrol,157%5Ev4%5Econtrol&utm_term=unity%E5%8D%8F%E7%A8%8B%E5%92%8C%E7%BA%BF%E7%A8%8B%E7%9A%84%E5%8C%BA%E5%88%AB&spm=1018.2226.3001.4187)是Unity独特的,利用计数器IEnumerator和StartCorountine来调用协程

只不过看到这里的应该都是大多懂Unity协程的运行进程的,所以我就不细讲了。

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using DG.Tweening;
  5. public class IEnumeratorDOTween : MonoBehaviour
  6. {
  7. Tween twn;
  8. void Start()
  9. {
  10. twn = transform.DOMove(new Vector3(2, 2, 2), 2f).SetLoops(3,LoopType.Yoyo);
  11. StartCoroutine(waitFuc());
  12. }
  13. IEnumerator waitFuc()
  14. {
  15. //等待动画完成
  16. yield return twn.WaitForCompletion();
  17. //执行几次循环以后
  18. yield return twn.WaitForElapsedLoops(2);
  19. //等待销毁以后
  20. yield return twn.WaitForKill();
  21. //等待运行的多少时间后
  22. yield return twn.WaitForPosition(1.5f);
  23. //等待到重新来的时候
  24. yield return twn.WaitForRewind();
  25. //等待起始化的时候
  26. yield return twn.WaitForStart();
  27. }
  28. }

十一丶路径动画

  这点有些难以讲解,推荐看我一开头推荐的老师讲的视频,然后以下是路径动画创建的整个过程:

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using DG.Tweening;
  5. using System.Linq;
  6. using System;
  7. public class PathAnimationDOTween : MonoBehaviour
  8. {
  9. //创建一个路径编辑器
  10. public Transform[] listTrans;
  11. void Start()
  12. {
  13. var listPosition = listTrans.Select(u => u.position).ToArray();
  14. transform.DOPath(listPosition, 5f,PathType.Linear,PathMode.Full3D,10,Color.red)
  15. .SetOptions(true,AxisConstraint.None,AxisConstraint.Y) //bool 是否为闭口,锁定哪个轴以及哪个 转向
  16. .SetLookAt(new Vector3(0,0,0)); //一直看到0,0,0这个点
  17. //SetLokkAt(0)一直看前方,数值为010.3是和正前方的角度的夹角
  18. //SetOptions(bool是否是封闭路径,AxisConstrains.锁定哪个轴,AxisContstrains.锁定哪个角度)
  19. }
  20. }

然后把我们创建的八个新方块拖进来List,然后点击运行,会发现已经创建好路径了,接下来你的Cube将按照设置的参数属性等进行移动


学习产出:

 以上便是本人当前对DOTween的所有理解,如果你能看到最后说明你耐心是真的NB。

接下来的文章会对学到DOTween进行综合应用,感谢支持。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/89787
推荐阅读
相关标签
  

闽ICP备14008679号