DOTween 是 Unity 生态中最受欢迎的补间动画插件,没有之一。它用极简的 API 解决了 Unity 原生动画系统繁琐、不易脚本控制的问题。无论是 UI 弹窗、角色移动、摄像机漫游,还是复杂的时序动画,DOTween 都能让你几行代码搞定。
一、安装与配置
1.1 安装导入
方式一:通过 Package Manager
- 打开
Window→Package Manager - 点击左上角的
+号,选择Add package by name... - 输入包名:
com.demigiant.dotween - 点击Add,等待几秒即可自动下载并导入。
方式二:手动导入
- 访问 DOTween 官网 下载
.unitypackage文件 - 双击该文件,或将其拖入 Unity 的
Project窗口 - 在弹出的 Import 对话框中全选,点击 Import。
1.2 安装后的关键一步:运行 Setup(必须)
导入完成后,并不会自动生效,你需要运行一次Setup来激活 DOTween。这一步是编辑器环境配置,不是代码初始化。
具体操作:
- 导入后,Unity 通常会自动弹出一个DOTween Setup Wizard窗口。打开菜单栏
Tools→Demigiant→DOTween Utility Panel。 - 在面板中点击
Setup DOTween。 - 会弹出一个新窗口,里面列出了一些可选组件(如
DOTweenAnimation、DOTweenPro等)。保持默认全选,然后点击Apply即可。
完成上述操作后,DOTween 会自动创建一个全局管理对象(运行时可见),不需要你手动挂载任何脚本到场景中。
1.3 关于“初始化”
- DOTween 会在你第一次调用任何动画方法(如
transform.DOMove)时,使用默认设置自动完成初始化。 - 你唯一需要确保的是上面第 1.2 步的Setup 已经运行过,否则动画将无法执行。
- 如果你硬要在代码中调用
DOTween.Init(),它只会在自动初始化之前才有意义;一旦补间已经创建,再调用就不会生效。所以大多数情况下,你完全不需要写这行代码。
那么什么时候需要配置代码呢?
如果你想修改全局默认参数(比如默认缓动类型、容量大小),可以在任意脚本的Awake或Start中设置:
using DG.Tweening; void Awake() { // 设置全局默认缓动(所有动画默认使用 OutQuad) DOTween.defaultEaseType = Ease.OutQuad; // 调整同时运行的补间数量上限,避免频繁扩容(推荐在项目启动时设置) DOTween.SetTweensCapacity(500, 100); // 可选:关闭日志、开启安全模式等 // DOTween.Init(true, true, LogBehaviour.Default); }二、基础操作
2.1 引入命名空间
所有使用 DOTween 的脚本顶部都必须添加:
using DG.Tweening;2.2 最常用的变换动画
public class BasicTween : MonoBehaviour { void Start() { // 2 秒内移动到 (5,0,0) transform.DOMove(new Vector3(5, 0, 0), 2f); // 1.5 秒内旋转到 (0,180,0) transform.DORotate(new Vector3(0, 180, 0), 1.5f); // 1 秒内放大到 2 倍 transform.DOScale(Vector3.one * 2, 1f); } }常用方法速查表:
| 方法 | 作用 |
|---|---|
DOMove/DOLocalMove | 世界/本地移动 |
DORotate/DOLocalRotate | 世界/本地旋转 |
DOScale | 缩放 |
DOFade(需配合CanvasGroup) | 透明度渐变 |
DOColor | 颜色变化 |
DOJump | 跳跃弧线运动 |
2.3 链式调用与缓动(Easing)
DOTween 支持流畅的链式写法,并内置数十种缓动函数:
void Start() { transform.DOMoveX(5, 1f) .SetEase(Ease.OutBounce) // 弹跳效果 .SetDelay(0.5f) // 延迟 0.5 秒 .SetLoops(2, LoopType.Yoyo) // 循环 2 次,来回 .OnComplete(() => Debug.Log("动画结束")); }常用缓动速记:
Ease.OutBack:回弹(适合 UI 弹出)Ease.OutBounce:弹跳Ease.InOutQuad:平滑加速减速Ease.Linear:匀速
2.4 控制动画播放
Tween myTween = transform.DOMove(Vector3.one, 2f); myTween.Play(); // 播放 myTween.Pause(); // 暂停 myTween.Restart(); // 重新开始 myTween.Kill(); // 立即终止并释放2.5 DOTween.To 自定义值动画
当你需要对任意变量做动画时,DOTween.To是万能法宝:
public float myFloat = 0; public Vector3 myVec = Vector3.zero; void Start() { DOTween.To(() => myFloat, x => myFloat = x, 10, 3f); DOTween.To(() => myVec, v => myVec = v, new Vector3(5,5,5), 2f); }三、进阶操作
3.1 Sequence 序列动画 – 编排复杂时序
Sequence能让你像导演一样控制多个动画的顺序和并行关系。
void Start() { Sequence seq = DOTween.Sequence(); // 第一步:移动 seq.Append(transform.DOMoveX(5, 1f)); // 移动的同时缩放(并行) seq.Join(transform.DOScale(2f, 1f)); // 接着旋转 seq.Append(transform.DORotate(new Vector3(0, 180, 0), 0.5f)); // 插入一个颜色变化,从第 0.5 秒开始 seq.Insert(0.5f, GetComponent<Renderer>().material.DOColor(Color.red, 0.3f)); seq.Play(); }Append:顺序添加(等上一个完成)Join:并行(与上一个同时开始)Insert:在指定时间点插入
实战:弹窗入场动画
public class Popup : MonoBehaviour { public RectTransform rect; public CanvasGroup group; public void Show() { // 重置初始状态 rect.localScale = Vector3.one * 0.8f; group.alpha = 0; rect.anchoredPosition = new Vector2(0, 50); Sequence seq = DOTween.Sequence(); seq.Join(rect.DOScale(1f, 0.3f).SetEase(Ease.OutBack)); seq.Join(group.DOFade(1f, 0.3f)); seq.Join(rect.DOAnchorPosY(0, 0.3f).SetEase(Ease.OutSine)); seq.Play(); } }3.2 回调系统 – 监听动画每个时刻
transform.DOMove(Vector3.one, 2f) .OnStart(() => Debug.Log("开始")) .OnUpdate(() => Debug.Log("每帧更新")) .OnComplete(() => { Debug.Log("完成,销毁对象"); Destroy(gameObject); }) .OnKill(() => Debug.Log("被终止"));3.3 From() 反向动画
让动画从目标值“飞回”当前值,常用于入场效果:
// 从 (5,0,0) 移动到初始位置(即从右方飞入) transform.DOMove(new Vector3(5,0,0), 1f).From(); // 从透明变为不透明(淡入) canvasGroup.DOFade(0, 1f).From();3.4 DOPath 路径动画
让物体沿指定路径移动,支持 Catmull-Rom 平滑曲线:
Vector3[] path = new Vector3[] { new Vector3(0,0,0), new Vector3(5,2,0), new Vector3(10,0,0), new Vector3(5,-2,0) }; transform.DOPath(path, 3f, PathType.CatmullRom) .SetEase(Ease.Linear) .SetLoops(-1, LoopType.Yoyo); // 无限循环来回3.5 DOTweenAnimation 组件(无代码动画)
DOTween 自带可视化组件,可以直接挂在 GameObject 上,在 Inspector 里配置目标值、时长、缓动等,适合设计师或快速原型。
- 添加组件:
Add Component→ 搜索DOTweenAnimation - 配置好后,勾选
AutoPlay即可在运行时自动播放。
你也可以在代码中动态添加并配置:
DOTweenAnimation da = gameObject.AddComponent<DOTweenAnimation>(); da.animationType = DOTweenAnimationType.LocalMove; da.targetValue = new Vector3(5,0,0); da.duration = 1f; da.easeType = Ease.OutQuad; da.autoPlay = true;3.6 性能优化与资源清理
- 设置容量:在项目启动时调用
DOTween.SetTweensCapacity(500, 100),防止动态扩容产生 GC。 - 及时 Kill:当对象被销毁时,最好调用
transform.DOKill()或DOTween.KillAll(),避免残留补间报错。 - 使用
SetAutoKill(true):让补间完成后自动销毁,无需手动管理。
四、常见问题与排坑
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
导入后报错CS0246 | 未运行 Setup | 运行 Tools → DOTween Utility Panel → Setup |
| 动画不播放 | 忘记加using DG.Tweening | 补上命名空间 |
| 对象销毁后报错 | 动画未 Kill | 在OnDestroy中调用DOKill() |
| 内存占用高 | 未设置容量 | 调用SetTweensCapacity并开启 AutoKill |
| 低版本 Unity 无法导入 | 版本不兼容 | 去官网下载对应版本的.unitypackage |