Bootstrap

u3d插件之DOTween

一.DOTween简介

在游戏开发中,使用引擎API完成各种动画的需求是大量存在的。若多种场合需要用一种动画表现,则需要用函数实现动画来快速开发,多处调用;DOTWeen则实现了这个需要,不用我们自己开发类库,使用DOTWeen可以快速实现各种动画。

DOTween官网

二.DOTWeen环境配置

2.1 DOTween导入

  • AssetStore查找DOTween并添加至我的资源

  • Package Manager中导入DOTween

  • 通过菜单Tools->Demigiant->DOTween Utility Panel打开界面DOTween Utility Panel
  • 点击Setup DOTWeen完成导入dll和激活模块

  • 点击Apply

2.2 引入命名空间

using DG.Tweening;

2.3 初始化(可选)

// EXAMPLE A: initialize with the preferences set in DOTween's Utility Panel
DOTween.Init();
// EXAMPLE B: initialize with custom settings, and set capacities immediately
DOTween.Init(true, true, LogBehaviour.Verbose).SetCapacity(200, 10);

三.基础概念

Tweener:A tween that takes control of a value and animates it.

可理解为补间动画对象,本质是DOTween内的class

Sequence:A special tween that, instead of taking control of a value, takes control of other tweens and animates them as a group.

可理解为多个补间动画对象,本质是DOTween内的class

Tween:A generic word that indicates both a Tweener and a Sequence.

可理解为补间动画对象,本质是DOTween内的class

四.组件方式创建动画

形式:

m_transform.DOMove(new Vector3(0, 10, 0), 1f);
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;

public class DOTweenDemo : MonoBehaviour
{
    Transform m_transform;
    void Start()
    {
        m_transform = GetComponent<Transform>();
        
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            m_transform.DOMove(new Vector3(0, 10, 0), 1f);
        }
    }
}

组件所具有的DOTWeen API可以参考官网

也可以输入前缀用智能提示显示出来

五.通用方式创建动画

静态方法:DOTween.To

static DOTween.To(getter, setter, to, float duration)

在duration时间内将属性的值从当前改变至指定的值

参数说明
getter:一个返回要改变属性的代理. 可以使用lambda: ()=> propertyName
setter:对要改变属性进行赋值的代理. 可以使用lambda: x=> propertyName= x
to:属性要设置的值
duration :动画持续时间

//匿名函数形式
DOTween.To(delegate () { return m_transform.position; }, delegate (Vector3 v) {m_transform.position = v; }, new Vector3(0, 15, 0), 1f);
//lambda形式
DOTween.To(() => transform.position, x => transform.position = x, new Vector3(0, 12, 0), 1f);

当组件方式(快捷方式)可用时,没有理由使用通用方式,但它是为了让您了解 DOTween 逻辑的核心(因为快捷方式在后台使用通用方式)

六.链式调用

下面演示API链式调用写法,推荐第二种

// Create a transform tween and set its ease, loops and OnComplete callback
transform.DOMove(new Vector3(2,2,2), 2).SetEase(Ease.OutQuint).SetLoops(4).OnComplete(myFunction);

// Same as above but using line breaks to make it more readable
transform.DOMove(new Vector3(2,2,2), 2)
  .SetEase(Ease.OutQuint)
  .SetLoops(4)
  .OnComplete(myFunction);

// Same as above but storing the tween and applying settings without chaining
Tween myTween = transform.DOMove(new Vector3(2,2,2), 2);
myTween.SetEase(Ease.OutQuint);
myTween.SetLoops(4);
myTween.OnComplete(myFunction);

七.API前缀

DO:组件式调用 + DOTween静态类

transform.DOMoveX(100, 1);
DOTween.Play();

Set:对动画设置的API

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

On:回调相关的API

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

八.按顺序执行动画(Sequence)

如果要A动画结束执行B动画这样的需求,需要用到Sequence

Sequence类似于补间动画,但它们不是对属性或值进行动画处理,而是将其他补间动画或序列作为一个组进行动画处理。

Sequence使用方式:

1.创建Sequence对象

2.向Sequence对象添加动画对象

//创建Sequence对象
Sequence mySequence = DOTween.Sequence();
// Add a movement tween at the beginning
mySequence.Append(transform.DOMoveX(45, 1));
// Add a rotation tween as soon as the previous one is finished
mySequence.Append(transform.DORotate(new Vector3(0,180,0), 1));
// Delay the whole Sequence by 1 second
mySequence.PrependInterval(1);
// Insert a scale tween for the whole duration of the Sequence
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()));

九.DOTween专业版

DOTween专业版会新增Animation和Path组件,以及一些示例场景,先了解即可,用到时再研究

;