zoukankan      html  css  js  c++  java
  • DOTween教程

    参考自DOTween官方文档:
    DOTween起始上手起来很快,当然前提也是用心看一下哈。

    > 可以在Unity AssetStore下载得到。

    使用方法:
    准备:

    在导入DOTween后,你需要设置dotween额外的库设置基你的Unity版本。Tools—–>DOTween Utility
    Panel——>点击SetupDoTween即可。DOTween只是为了对应Unity的版本不需关心更多。**

    这里写图片描述



    一,最先简单的使用一下DOTween:

    using UnityEngine;
    using System.Collections;
    using DG.Tweening;//DOTween命名空间
    
    public class Basics : MonoBehaviour
    {
        //tweeen的目标对象
        public Transform cubeA, cubeB;
    
        void Start()
        {
            //全局初始化
            DOTween.Init(false, true, LogBehaviour.ErrorsOnly);
    
            //快捷方式创建tween
            cubeA.DOMove(new Vector3(-2, 2, 0), 1).SetRelative().SetLoops(-1, LoopType.Yoyo);
            //通用方式创建tween
            DOTween.To(()=> cubeB.position, x=> cubeB.position = x, new Vector3(-2, 2, 0), 1).SetRelative().SetLoops(-1, LoopType.Yoyo);
    
        }
    }

    给cubeA,B指定连个Cube后运行,就可以看到效果了。

    这里写图片描述



    前提说明:
    Tweener:一个持有值的控制并使值起作用的tween
    Sequence:一个特殊的tween,与其控制一个值,Sequence控制其它tweens和将它们当成一个组。
    Tween:一个通用的词,表名包括Tweener和Sequence Nested
    tween : 一个包含在Sequence内的tween。

    方法前缀:Prefixes 前缀对于编辑器代码感应很重要,所以计量记住这些:
    DO开头:操作所有已知对象,如transform对象或material对象。当然也是DOTween类的前缀。

    transform.DOMoveX(10, 1);
    transform.DORestart();
    DOTween.Play();

    Set: 所有可以链式返回tween的设置。(除了From之外,尽管把它当作一个设置来用,但它实际上并不是一个真正的设置)

    myTween.SetLoops(4, LoopType.Yoyo).SetSpeedBased();

    On: 所有可链式返回tween的回调

    myTween.OnStart(myStartFun).OnComplete(myFunction);



    二 ,解析(初始化):

    1,在要使用Dotween的类里引入命名空间 DG.Tweening;

    2,初始化DOTween全局配置,不初始化将使用默认值,后面仍可以改变初始化的配置,具体方法下步。

    需要记住:如果在创建第一个Tween后才调用DOTween.Init将不会生效。
    考虑到你仍然在任何时候初始化设置,可以使用全局设置。Global settings
    通常,你可以在调用DOTween后链式调用DOTween.SetTweensCapacity来一同初始化可同时执行最大的Tweers和Sequence数量。
    例子如下举例B:

    还有多一种选择就是使用设置Panel的初始化配置:假如在DOTween.Iint初始化时不传任何参数或者传空,那么DOTween将会对此参数使用Panel的设置,但仍需要在代码调用一次Init并参数为空,要不将使用默认的参数。如:

    在Unity工具栏: Tools—–>DOTween Utility Panel—>Preferences 设置:
    这里写图片描述

    //举例A,使用设置面板的初始化设置
    DOTween.Init();
    
    //举例B:用指定参数初始化,并同时指定最大同时执行Tweeners和Sequence的容量
    DOTween.Init(true, true, LogBehaviour.Verbose).SetCapacity(200, 10);

    解析一下初始化参数

    /// <summary>
    /// 初始化
    /// </summary>
    /// <param name="recycleAllByDefault">
    /// 默认值为false
    /// 如果为true那么所创建的tween建可以循环利用,这意味着当tween播放挂起时并不会被摧毁,
    /// 它们将会被放到缓存池待重新使用,这样可以避免GC再为可重复利用的tween分配。但tween挂起你
    /// 将需要注意对tween的引用,因为它们就算挂起了,仍可以会被激活,也有可能正被其它的tween使用而被激活。
    /// 如果你想tween挂起时自动把tween设置为null,可以这样:
    /// myTween.OnKill(()=>mytween = null)
    /// 你任何时候都可以改变这个设置:
    /// 改变静态变量DG.Tweening.DOTween.defaultRecyclable的参数
    /// 或者你也可以为某个tween指定设置这个参数:myTween.SetRecyclable(bool recyclable)
    /// 
    /// </param>
    /// <param name="useSafeMode">
    /// 默认为false
    /// 如果为true,那么tween将会有些性能将会低一些,但更安全,tween将会去处理一系列事情,如tween在播放而目标为空。
    /// </param>
    /// <param name="logBehaviour">
    /// 打印什么类型日志,默认打印error类型
    /// </param>
    /// <returns></returns>
    public static IDOTweenInit Init(bool? recycleAllByDefault = null, bool? useSafeMode = null, LogBehaviour? logBehaviour = null);
    


    三,解析(tween创建方式和设置tween):

    创建tween有3中方式:通用方式,快捷方式,额外通用方式。

    1,通用方式: 这是最灵活的方式,播放中间几乎允许你进行任何值得运算,包括public private static或dynamic(和你想的一样,快捷调用方式最后也是调用这个方法)

    //使myVector在一秒内变换到到3,4,8
    DOTween.To(getter, setter, to, float duration)
    DOTween.To(()=> myVector, x=> myVector = x, new Vector3(3,4,8), 1);
    // 在一秒内变换float类型值到52
    DOTween.To(()=> myFloat, x=> myFloat = x, 52, 1);

    2,快捷方式:

    DOTween的快捷方法一些Unity类实例可以使用,像transform, Rigibody和Material等,可以直接从它们的引用开始一个tween, (也将自动的设置这个对象自身为tween驱动的对象) 除了个别指定的外,每个快捷调用也都有一个Form()方法的调用,直接在快捷方法后链式调用From()就会把目标 tween变为起始Tween(也就是把始终位置调换)。 记住:当把Form分配给tween时,目标对象位置将直接跳到起始位置(你写那行代码时就跳,而不是等到tween启动)。

    //transform将移动到Vector3(2,3,4) transform.DOMove(new Vector3(2,3,4), 1);
    rigidbody.DOMove(new Vector3(2,3,4), 1);
    material.DOColor(Color.green, 1);
    
    //From()后反过来,从Vector(2,3,4)到现在的位置 transform.DOMove(new Vector3(2,3,4), 1).From();
    rigidbody.DOMove(new Vector3(2,3,4), 1).From();
    material.DOColor(Color.green, 1).From();
     ```
     
    

    3,额外通用的法式:
    这些额外通用的方式允许tween的值通过特殊的方式指定。 除了指定的外,这些方式也有Form(),与快捷调用类似。

    DOTween.Shake(()=> myVector, x=> myVector = x, 1, 5, 10, 45, false);
    
    DOTween.ToAlpha(()=> myColor, x=> myColor = x, 0, 1); 

    无论使用哪种方法,最终会返回一个Twenner或Sequence 所以你仍然可以保持着它们的引用,也可以不关心他们的区别都保存为一个Tween。 也可以直接使用DOTween的多种静态方控制Tween:

    //回放所有
    tween DOTween.RewindAll(); 
    //回放指定ID的
    tween DOTween.Rewind(myId);

    以上只是创建了tween,下面说明如何设置tween,如 渐变类型,全局时间缩放等。

    设置分为全局设置和特殊设置:

    1,全局设置:

    你可以设置全局配置,这将应用到新建的tween,全局设置允许设置tween自动播放那个和自动关闭行为,渐变类型,全局时间缩放,之类的参数。 设置的方法通常都是DOTween的静态方法:

    DOTween.defaultAutoKill = false; DOTween.defaultEaseType = Ease.InOutCirc;

    2,特殊设置:
    特殊设置是通过分配的链将以“Set”开始(callback除外),所以编辑器的代码感知会帮你找到它们。

     //创建一个transformtween,设置它的ease,loops和完成回调 transform.DOMove(new Vector3(2,2,2), 2) .SetEase(Ease.OutQuint) .SetLoops(4) .OnComplete(myFunction);
    //同上,但持有tween的引用来设置,不使用链式编程
    Tween myTween = transform.DOMove(new Vector3(2,2,2), 2); 
    myTween.SetEase(Ease.OutQuint); myTween.SetLoops(4); myTween.OnComplete(myFunction);
    

    然而,一些tween类型有它们特殊的选项,这个由tween的值类型可不可以设置SetOptions()决定,只要记住setOption()是特殊的,在maim tween的创建方法后要立刻绑定调用:

    //和之前的例子一样,但强制转换transform为interger单元值(这对像素填充来说很有用)
     transform.DOMove(new Vector3(2,2,2), 2) .SetOptions(true) .SetEase(Ease.OutQuint) .SetLoops(4) .OnComplete(myFunction);。
    

    甚至可以copy一个tween的设置到另一个tween,使用SetAs()

    //创建一个tween并进行设置,然后保持它的引用 Tween myTween = transform.DOMove(new Vector3(2,2,2), 2) .SetEase(Ease.OutQuint) .SetLoops(4) .OnComplete(myFunction);
    
    //C创建另外一个tween,使用上一个相同的设置 material.DOColor(Color.red, 2) .SetAs(myTween);
    
    //所有的tween将以Ease.OutQunit 循环loop 4次,完成后调用同一方法,即使tween的对象和类型不一样
    


    四,创建一个Sequence:

    Sequence像Tweeners,但并不直接控制参数或值,而是把Tweeners或Sequence当成一个组。
    Sequence可以包含Sequence,多少有hirecrchy的深度决定,没有限制。

    可以用如下两个步奏创建一个Sequence:

    //1,获取一个新的Sequence,并保持它的引用
    //返回一个可用的Sequence,你可以往里面Add tween它会保存起来
    equence mySequence = DOTween.Sequence();
    
    //2,增加tween,间隔和回调到Sequence
    //记住:这些方法必须在Sequence Start前的起作用(通常是你创建之后的下一帧,除非已停止),在Start之后的将不会有效果。
    mySequence.Append(transform.DOMoveX(45, 1));
    mySequence.AppendInterval(interval);
    
    //给定的时间插入一个tween,允许你重叠已存在的tween而不是替换
    mySequence.InsertCallback(1, MyCallback);

    提示:如果你创建一个Sequence知识为了使用回调和定时器,那么可以这样使用:

     // 获取一个空的Sequence
    Sequence mySequence = DOTween.Sequence();
    // 在开启添加一个move的tween
    mySequence.Append(transform.DOMoveX(45, 1));
    // 在第一个结束后开启一个旋转的tween
    mySequence.Append(transform.DORotate(new Vector3(0,180,0), 1));
    // 所有的延迟一秒
    mySequence.PrependInterval(1);
    // 在整个Sequence期间插入一个缩放的tween
    mySequence.Insert(0, transform.DOScale(new Vector3(3,3,3), mySequence.Duration()));
    
    
    //和上面的例子效果一样,但使用链式编程,使其看起来更简洁
    Sequence mySequence = DOTween.Sequence();
    
    mySequence.Append(transform.DOMoveX(45, 1))
      .Append(transform.DORotate(new Vector3(0,180,0), 1))
      .PrependInterval(1)
      .Insert(0, transform.DOScale(new Vector3(3,3,3), mySequence.Duration()));


    五,其它:

    当你创建一个tween的时候它将会自动播放直到完成loop次数,除非你改变全局设置的defaultAutoPlay设置。
    当一个tween播放完成将会自己摧毁,这意味着你不能再次使用这个tween,除非你改变全局设置的defultAutoKill
    如果你的tween的target为空,在tween播放时将会报错,你需要注意这个问题或者激活安全模式。

    如果你激活recycling(再循环),DOTween将会缓存你创建的所有的tween,所以可以不再建新的tween就可以重复利用它们。
    当然,为了避免占用过大的资源,里面设置最大200个tween和50个Sequence同时运行,如果需要更多,DOTween将自动递增容量,但你也可以直接闭避免卡顿自动调整容量
    //设置最大tween数量3000和最大Sequences数量200:
    DOTWeen.SetTweensCapacity(3000,200);
    任何时候你想清除DOTween的缓存或彻底重置它们,可以调用DOTween.Clean(),这将摧毁所有的tween和清除所有的DOTween缓存。

    //循环利用a tween
    你不需要手动循环利用tweens,你可以选择自动重复利用全部或者只指定一些,你依旧可以任何时候改变Tweener的结束和开始值

  • 相关阅读:
    课堂测试-文本操作
    异常的总结
    动手动脑实验-异常
    从小工到专家-读后感3
    从小工到专家-读后感2
    从小工到专家-读后感1
    构建之法读书笔记(一)
    2.12日总结
    BaseAdapter的使用
    Activity之Bundle的使用
  • 原文地址:https://www.cnblogs.com/android-blogs/p/5855359.html
Copyright © 2011-2022 走看看