Unity3D DOTween

简单介绍一下 DOTween 插件的使用。

导入插件

先到 Asset Store 获取 DOTween 插件,然后在 Package Manager 的 My Assets 中搜索,下载并导入插件。

导入后,会自动弹出一个窗口,提示需要先对插件进行配置。

点击上图中的按钮,打开下图的窗口,按顺序点击 Setup DOTween 和 Create ASMDEF 按钮。

配置完成后就可以开始使用 DOTween 插件了。

简单动画

创建一个脚本 DOTweenDemo.cs,在场景中创建一个空物体并挂载脚本。

在场景中创建一个 Cube,拖拽引用。

要使用 DOTween,需要引入命名空间 DG.Tweening,然后通过组件扩展的以 DO 开头的函数方法进行调用。

例如,transform.DOMoveX 是让物体在 X 轴方向上进行移动,第一个参数是目标位置,第二个参数是持续时间。

csharp 复制代码
using UnityEngine;
using DG.Tweening;

public class DOTweenDemo : MonoBehaviour
{
    public GameObject cube;

    public float posX = 5f;
    public float duration = 1f;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Alpha1))
        {
            cube.transform.DOMoveX(-posX, duration);
        }
        else if (Input.GetKeyDown(KeyCode.Alpha2))
        {
            cube.transform.DOMoveX(posX, duration);
        }
    }
}

运行游戏,按下键盘 1 键时 Cube 向左移动,按下键盘 2 键时 Cube 向右移动。

动画序列

在实际项目中,动画会更加复杂一些,可能会有多段位移,或者位移后缩小的需求。

通常会使用动画序列来实现复杂动画。

使用 DOTween.Sequence 创建一个动画序列对象,通过 sequence.Insert 在指定时刻插入一个简单动画。

例如,在最开始 0 秒的位置,让 Cube 移动到右边。

因为持续时间是 1 秒,所以在 1 秒的位置,上一个动画结束了,继续插入第二个动画,让 Cube 向上移动。

后续的动画以此类推。

csharp 复制代码
using UnityEngine;
using DG.Tweening;

public class DOTweenDemo : MonoBehaviour
{
    public GameObject cube;

    public float posX = 5f;
    public float posY = 5f;
    public float duration = 1f;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Alpha1))
        {
            Sequence sequence = DOTween.Sequence();
            sequence.Insert(0f, cube.transform.DOMoveX(posX, duration));
            sequence.Insert(1f, cube.transform.DOMoveY(posY, duration));
            sequence.Insert(2f, cube.transform.DOMoveX(-posX, duration));
            sequence.Insert(3f, cube.transform.DOMoveY(0f, duration));
        }
    }
}

运行游戏,按下键盘 1 键时 Cube 进行了四段位移。

动画回调

有时候,我们想要在动画播放完成之后执行一些逻辑,就可以使用动画的回调方法。

例如,让 Cube 向前移动,到达指定位置之后,再缩小。

csharp 复制代码
using UnityEngine;
using DG.Tweening;

public class DOTweenDemo : MonoBehaviour
{
    public GameObject cube;

    public float posX = 5f;
    public float posY = 5f;
    public float duration = 1f;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Alpha1))
        {
            cube.transform.DOMoveZ(5f, duration).OnComplete(()=>
            {
                cube.transform.DOScale(0f, duration);
            });
        }
    }
}

运行效果:

结束动画

有时候,玩家进行了某些操作,需要提前让动画结束,有两种方法。

一种是直接 Kill 掉动画,即中断动画。

一种是提前完成动画。

在 Kill 掉动画的时候,需要先为动画设置 id,然后使用 DOTween.Kill 中断指定 id 的动画。

注意:这里只为 DOMoveZ 设置了 id,当它结束时播放的另一个缩放动画是不会被 Kill 掉的。

csharp 复制代码
using UnityEngine;
using DG.Tweening;

public class DOTweenDemo : MonoBehaviour
{
    public GameObject cube;

    public float posX = 5f;
    public float posY = 5f;
    public float duration = 1f;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Alpha1))
        {
            cube.transform.DOMoveZ(5f, duration).OnComplete(()=>
            {
                cube.transform.DOScale(0f, duration);
            }).SetId("cube");
        }
        else if (Input.GetKeyDown(KeyCode.Alpha2))
        {
            DOTween.Kill("cube");
        }
    }
}

运行效果,先按键盘 1 键执行动画,再立刻按键盘 2 键中断动画。

提前完成动画,只需要调用 DOComplete 函数即可。

这里因为是 transform 调用的,对于两段动画来说,都是可以提前完成的。

csharp 复制代码
using UnityEngine;
using DG.Tweening;

public class DOTweenDemo : MonoBehaviour
{
    public GameObject cube;

    public float posX = 5f;
    public float posY = 5f;
    public float duration = 1f;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Alpha1))
        {
            cube.transform.DOMoveZ(5f, duration).OnComplete(()=>
            {
                cube.transform.DOScale(0f, duration);
            });
        }
        else if (Input.GetKeyDown(KeyCode.Alpha2))
        {
            cube.transform.DOComplete();
        }
    }
}

运行效果,先按键盘 1 键执行动画,再立刻按键盘 2 键提前完成动画,会有一个动画跳跃的视觉效果。

延迟调用

DOTween 除了做一些动画效果外,还可以当做定时器,延迟一段时间后调用。

csharp 复制代码
using UnityEngine;
using DG.Tweening;

public class DOTweenDemo : MonoBehaviour
{
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Alpha1))
        {
            Debug.Log("开始定时");
            DOVirtual.DelayedCall(1f, ()=>
            {
                Debug.Log("1 秒后调用");
            });
        }
    }
}

运行效果:

相关推荐
浅陌sss1 天前
设计模式 --- 原型模式
unity·游戏引擎
1 天前
Unity中基于2.5D的碰撞系统
unity·游戏引擎
scott.cgi1 天前
「Unity3D」TextMeshPro中的TMP_InputField,用来实现输入框的几个小问题
unity·ugui·textmeshpro·tmp_inputfield·inputfield·inputfield输入框·ugui输入框
蔗理苦2 天前
2025-04-08 NO.4 Quest3 交互教程
unity·交互·vr·quest
我有医保我先冲2 天前
智能仓储数字孪生Demo(Unity实现)
unity·游戏引擎
EQ-雪梨蛋花汤2 天前
【Unity】Unity Transform缩放控制教程:实现3D模型缩放交互,支持按钮/鼠标/手势操作
3d·unity·交互
晴空了无痕3 天前
群体智能避障革命:RVO算法在Unity中的深度实践与优化
算法·unity·游戏引擎
EQ-雪梨蛋花汤3 天前
【UnityEditor扩展】如何在 Unity 中创建棱柱体(用作VR安全区检测),同时在编辑器插件中实现与撤销/恢复功能
unity·编辑器·vr
BuHuaX3 天前
C#的反射机制
服务器·unity·c#·游戏引擎·游戏程序
不吃斋的和尚3 天前
Unity HDRP管线用ShaderGraph还原Lit,方便做拓展;
unity·游戏引擎