DoTween使用

对变量进行动画

static DOTween.To(getter, setter, to, float duration)
getter:lambda表达式  ()=> myValue 
setter:lambda表达式  (x)=> myValue = x 
to:最终值
duration:补间时长
例如:
DOTween.To(()=> myVector, x=> myVector = x, new Vector3(3,4,8), 1);
DOTween.To(()=> myFloat, x=> myFloat = x, 52, 1);

物体的移动和旋转

移动的方法用法类似只有两个常用的分别是DOMove()和DOLocalMove(),主要是对世界坐标和局部坐标区分的,当然你也可以对单个轴进行动画,比如上面的平移操作可以使用DOLocalMoveX();

旋转常用的就是DORotate(),DOLocalRotate()旋转三维向量
DORotateQuaternion()旋转四元数
游戏中常用的DOLookAt(),比自己写差值方便很多,具体参数可以查看官方例子

    public RectTransform panelTransform;

    private bool isIn = false;
    void Start() {
        //panelTransform.DOMove(new Vector3(0, 0, 0), 1);//让paneltransfrom从当前位置 动画到 0,0,0的位置 时间为1s (修改的世界坐标)
        Tweener tweener = panelTransform.DOLocalMove(new Vector3(0, 0, 0), 0.3f);//默认动画播放完成会被销毁
                                                                                 //Tweener对象保存这个动画的信息 每次调用do类型的方法都会创建一个tweener对象,这个对象是dotween来管理
        tweener.SetAutoKill(false);// 把autokill 自动销毁设置为false
        tweener.Pause();//暂停动画播放
    }

    public void OnClick() {
        if (isIn == false) {
            panelTransform.DOPlayForward();//前放
            isIn = true;
        }
        else {
            //让panel离开屏幕
            panelTransform.DOPlayBackwards();//倒放
            isIn = false;
        }
        
    }

这个需要注意,ui和3d物体不一样,他的移动是控制RectTransform,而且ui的坐标都是局部坐标,这里我们因为dotween每次都会自动销毁,对我们做返回不好,所以使用SetAutoKill(false)不时它销毁,但是如果放在update方法的话每次执行都会生成一个动画存放在tweener物体身上,因为不会自动销毁所以我们需要将它放在start里面生成,然后控制动画向前播放和向后播放就可以了。

改变物体大小

transform.localScale = Vector3.zero;
transform.DOScale(1, 1f);

屏幕震动效果

    void Start () {
    //参数分别是震动时间和相机位移的向量,震动次数和随机方向,比如我不想让前后动,就把z轴设置为0
        transform.DOShakePosition(1,new Vector3(3,3,0),10,90);
    }

抖动效果,和震动类似但是可控参数更多

        //第一个参数 ,抖动的方向,例如我这里是从当前位置向上抖动到1的位置
        //第二个参数,抖动的时间
        //第三个参数,抖动的次数
        //第四个参数 0-1之间的数,代表回弹的幅度,
        假如为零从最高点当前位置+Vector3.up回来的时候只会回到当前位置,如果为一就会回到当前位置-Vector3.up的位置
        transform.DOPunchPosition(Vector3.up, 2, 2, 0.5f);

颜色和透明的动画

普通UI的颜色

    private Text text;
    // Use this for initialization
    void Start () {
        text = GetComponent<Text>();

        //设置颜色
        //text.DOColor(Color.red, 2);
        //设置透明度
        text.DOFade(1, 3);
    }

3D物体我们通常使用材质球控制颜色和透明度

        Material ma = this.GetComponent<MeshRenderer>().material;
        ma.DOColor(new Color(0.5f, 0.5f, 0.5f, 1), 2);//注意当前材质的shader必须有_Color属性,如果没有或者名字不对会报错,需要给其他的赋值
        //例如:
         ma.DOColor(new Color(0.5f, 0.5f, 0.5f, 1),"_TintColor", 2);//不知道名字的可以通过编辑shader查看

动画融合-Blend

这个主要是用在两种同时需要的相同动画进行融合效果
例如
下面这种情况下dotween会忽略第一行动画效果直接执行最终的动画效果

transform.DOMove(new Vector3(0,1,1),2);
transform.DOMove(new Vector3(1,2,0),2);

这时候就需要用到我们的Blend动画融合,DOBlendableMoveBy()这个方法会将这两个动画的参数进行融合计算出最终的坐标当成一个动画进行融合,当然你也可以通过计算两个点的向量计算最终点的位置使用DOMove()方法进行移动.

transform.DOBlendableMoveBy(new Vector3(0,1,1),2);
transform.DOBlendableMoveBy(new Vector3(1,2,0),2);

反向播放-From

    void Start () {
        transform.DOMoveX(5, 3).From();
        //默认是从当前位置运行到目标位置  加上From()方法以后表示从目标位置移动到当前位置


        transform.DOMoveX(5, 4).From(true);
    }

from方式就是和直接使用是反方向的,比如第一句代码不加from方法是想从当前位置运动到5的位置,时间三秒,加上之后就是从5运动到当前位置时间3秒,from方法里面有一个参数,默认为false就是直接从目标位置运动到当前位置,如果改为ture就是相对坐标,也就是从距离5的位置运动到目标位置,假如当前位置是1,就是从1+5也就是6的位置运动到1的位置。

设置动画曲线,也就是动画运动的轨迹,以及动画事件

修改SetEase()这个方法里面的Ease即可
OnComplete是动画结束需要触发的事件,可以跟在任何动画后面

    void Start () {
        Tweener tweener = transform.DOLocalMoveX(0, 2);
        tweener.SetEase(Ease.OutBounce);//动画曲线
        tweener.OnComplete(OnTweenComplete);//动画结束事件
        tweener.SetLoops(2);//动画循环次数
    }
    

    void OnTweenComplete() {
        Debug.Log("动画播放完成了");
    }

生命周期函数

OnComplete();//绑定事件的函数
Onkill();//动画被销毁的时候调用
OnPlay();//动画播放的时候调用
OnPause();//动画暂停的时候调用
OnRewind();//动画被重置的时候
OnStart();//动画被播放的时候(只会调用一次)

连续动画-Sequence

如果想执行完第一个之后再执行第二个是不可以使用两行代码直接做动画的,dotween会默认执行第二个动画,所以我们想要再一个动画执行完成之后再执行第二个甚至第三个动画…这样就要使用OnComplete()或者队列保存动画列表挨个执行,一般队列是调用最方便的,OnComplete()在执行超过两个动画的拼接之后会出现莫名错误

    private void SizeTween ()
    {
        Sequence quence = DOTween.Sequence();
        quence.Append( damageText.rectTransform.DOScale(new Vector3(1.5f,1.5f,1.5f),0.3f));
        quence.AppendInterval(1);//两个动画之间的延时
        quence.Append(damageText.rectTransform.DOScale(new Vector3(1, 1, 1), 1));
    }

更多详解以及使用

Dotween常用方法详解
https://blog.csdn.net/zcaixzy5211314/article/details/84886663

Dotween Path 路径动画使用方法详解
https://blog.csdn.net/zcaixzy5211314/article/details/84988535

MoveEffectTool工具Github地址
https://github.com/BlueMonk1107/MoveEffectTool

Dotween Ease效果演示地址
http://robertpenner.com/easing/easing_demo.html

posted on 2019-09-25 15:51  北田  阅读(1894)  评论(0编辑  收藏  举报