Kenity

Kesa with Unity.

DoTween的使用方法(转载)

June 3, 2018 Kesa’s superego

转自Unity-Dotween

补间动画:又叫做中间帧动画,渐变动画,只要建立起始和结束的画面,中间部分由软件自动生成,省去了中间动画制作的复杂过程,这正是Flash的迷人之处,补间动画是Flash中最常用的动画效果。
参考链接
http://www.robertpenner.com/easing/easing_demo.html

Tween插件比较

TIM截图20180518223915.png

Dotween是众多Unity补间动画插件中效率最高,使用最方便,使用人数最多的一个。


Dotween方法前缀

DO前缀:适用于所有补间快捷方式(可以直接从已知对象开始的操作,如变换或材质)。 也是主DOTween类的前缀。

transform.DOMoveX(100, 1);
transform.DORestart();
transform.DoScale();

Set前缀:适用于所有可链接到补间的设置(除From之外,因为它作为设置应用,但不是真正的设置)。

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

On前缀:对于可以链接到补间的所有回调。

myTween.OnStart(myStartFunction).
myTween.OnComplete(myCompleteFunction);

创建一个Tweener

1.通用方式
2.快捷方式
3.其他方式

  • 1.通用。最灵活的,可以补间任何值(快捷世界上在后台使用通用方式)

    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);

  • 2.快捷方式:dotween扩展了unity的对象,像transform,rigidbody,material,可以直接使用
    例如:

    transform.DOMove(new Vector3(2,3,4), 1);
    rigidbody.DOMove(new Vector3(2,3,4), 1);
    material.DOColor(Color.green, 1);

或者[反向播放.From()]

transform.DOMove(new Vector3(2,3,4), 1).From();
rigidbody.DOMove(new Vector3(2,3,4), 1).From();
material.DOColor(Color.green, 1).From();

其他已实现扩展方法的类:

Unity5: 
AudioSource、Camera、Light、LineRenderer、Material、Rigidbody、Rigidbody2D、SpriteRenderer、TrailRenderer、Transform
Unity UI 4.6: 
CanvasGroup、Image、LayoutElement 、Outline、RectTransform、ScrollRect、SliderText
Pro版本: 
doPath,tk2dBaseSprite、tk2dSlicedSprite、tk2dTextMesh、TextMeshPro 、TextMeshProUGUI、Spiral
  • 3.其他方式:通用方式的其他特殊形式(不用掌握)
    例如:

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

使用方法API

Tweener paneltweener = panelTranform.DOScale (new Vector3(2,2,1),1f);
//多次调用DOTween动画会影响性能
//DOTween默认动画播放完毕时会自动销毁动画
//Tweener对象保存这个动画

paneltweener.SetAutoKill(false);              //禁止销毁动画

paneltweener.Pause();                         //停止播放动画
//paneltweener.SetDelay(0.5f);                //设置动画延迟播放
//paneltweener.SetEase(Ease.INTERNAL_Zero);   //设置动画运动的模式
//paneltweener.SetLoops(-1);                  //设置循环播放 (-1为循环播放;>0的时候则表示循环的次数)
paneltweener.SetLoops(-1,loopType);          //设置循环播放并且设置动画循环的模式

//paneltweener.PlayForward();                 //播放
//paneltweener.PlayBackwards();               //倒放


paneltweener.OnComplete(OnComplete);        //动画播放完毕后执行,动画倒放时候不执行
paneltweener.OnStart(OnStart);              //动画第一次播放时执行
paneltweener.OnUpdate(OnUpdate);            //动画播放时不断执行
paneltweener.OnPlay(OnPlay);                //动画开始播放时执行
//paneltweener.OnStepComplete(OnStepComplete);//动画播放且倒放都会执行一次,且执行顺序先于OnComplete
//paneltweener.OnKill(OnKill);                //动画删除的时候执行事件
//paneltweener.Kill(true);                    //删除动画且组件会直接到达指定位置

补间动画序列Sequence

  • 1.从Sequence末尾追加

    mySequence.Append(transform.DOMoveX(45, 1)); mySequence.AppendCallback(MyCallback); mySequence.AppendInterval(interval);

  • 2.在Sequence中间插入

    mySequence.Insert(1, transform.DOMoveX(45, 1)); mySequence.InsertCallback(1, MyCallback);

  • 3.在Sequence最后一个开始时间插入

    mySequence.Append(transform.DOMoveX(45, 1)); mySequence.Join(transform.DORotate(new Vector3(0,180,0), 1));

  • 4.从Sequence的开头追加

    mySequence.Prepend(transform.DOMoveX(45, 1)); mySequence.PrependCallback(MyCallback); mySequence.PrependInterval(interval);

例如:

Sequence mySequence = DOTween.Sequence();
mySequence.Append(transform.DOMoveX(45, 1));
mySequence.Append(transform.DORotate(new Vector3(0,180,0), 1));
mySequence.PrependInterval(1);
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()));