XTween 是一个高性能的 Unity 动画系统,提供了丰富的动画类型、缓动效果和灵活的控制方式。它采用对象池技术优化性能,支持编辑器预览,适用于 UI 和游戏对象的动画处理。 并且该插件是一个功能全面、性能优化的 Unity 动画解决方案,适用于各种动画需求,从简单的 UI 动效到复杂的游戏对象动画。其架构清晰度和零GC设计特别适合需要大量动态动画的项目(如UI密集型游戏)。相比主流插件,它在类型扩展性和内存控制上有独特优势,而链式API和完整文档则降低了使用门槛
- 核心层:XTween_Base 抽象基类处理通用动画逻辑(生命周期/进度计算/回调系统)
- 实现层:7种特化类型(Float/Int/Vector2/Vector3/Color/Quaternion/String)各自实现类型安全的插值计算
- 管理层:XTween_Manager单例全局管理,XTween_Pool对象池优化性能
- 通过抽象方法强制子类实现类型相关逻辑:
protected abstract T Lerp(T a, T b, float t);
protected abstract T GetDefaultValue();
- 每个Tween实例包含完整动画参数(start/end/duration/easeMode等)
- 通过Update()方法纯数据计算,与Unity组件解耦
- 零GC设计
- 使用对象池(XTween_Pool)复用实例
- 链表+字典管理活跃动画(避免List扩容)
- 预编译指令分离编辑器/运行时逻辑
- 高效更新机制
- 双缓冲队列:_PendingAdd/_PendingRemove避免迭代时修改
- 迭代器缓存:_ActiveTweens_CachedIterators减少遍历开销
- 延迟计算:按需重建缓存(_IteratorsDirty标记)
- 内存安全
- 自动清理无效引用(CleanDeadReferences)
- 回调注销检查(避免内存泄漏)
| 🌱 Controller | 🌱 Interface | 🌱 Pool | 🌱 Manager | 🌱 EaseLibrary | 🌱 Previewer |
|---|---|---|---|---|---|
| 动画控制器 | 动画接口 | 动画池 | 动画管理器 | 缓动库 | 预览器 |
| 动画控制器,支持多种动画类型(位置、旋转、缩放、颜色等),可配置动画参数(持续时间、延迟、缓动模式等,提供按键控制(播放、倒带、终止等)** | 支持多种动画类型(位置、旋转、缩放、颜色等),可配置动画参数(持续时间、延迟、缓动模式等),提供按键控制(播放、倒带、终止等) | 支持多种动画类型(位置、旋转、缩放、颜色等),可配置动画参数(持续时间、延迟、缓动模式等),提供按键控制(播放、倒带、终止等) | 动画注册/注销,每帧更新动画状态,提供动画查找功能 | Linear(线性),Sine(正弦),Quad(二次),Cubic(三次),Elastic(弹性),Bounce(弹跳)等 | 动画注册/注销,每帧更新动画状态,提供动画查找功能 |
| 类型 | 说明 | 关键方法 | 默认值 | 应用场景 |
|---|---|---|---|---|
| Specialized_Color | 处理颜色(Color)动画,支持RGBA通道插值 | Color.LerpUnclamped() |
Color.white |
UI颜色变化、透明度动画 |
| Specialized_Float | 处理浮点数(float)动画,实现平滑过渡 | Mathf.Lerp() |
0f |
进度条、数值变化 |
| Specialized_Int | 处理整数(int)动画,支持离散值变化 | Mathf.Lerp()+RoundToInt() |
0 |
分数计数、整数显示 |
| Specialized_Quaternion | 处理四元数(Quaternion)动画,支持3D旋转 | Quaternion.Lerp/SlerpUnclamped() |
Quaternion.identity |
3D物体旋转 |
| Specialized_String | 处理字符串(string)动画,支持逐字显示 | 字符截取计算 | string.Empty |
打字机效果 |
| Specialized_Vector2 | 处理二维向量(Vector2)动画 | Vector2.LerpUnclamped() |
Vector2.zero |
2D位置/尺寸变化 |
| Specialized_Vector3 | 处理三维向量(Vector3)动画 | Vector3.LerpUnclamped() |
Vector3.zero |
3D变换动画 |
| Specialized_Vector4 | 处理四维向量(Vector4)动画 | Vector4.LerpUnclamped() |
Vector4.zero |
特殊参数控制 |
| 缓动类型 | In | Out | InOut | 缓动类型 | In | Out | InOut | |
|---|---|---|---|---|---|---|---|---|
| Linear 线性 |
![]() |
![]() |
![]() |
-- | Sine 正弦曲线 |
![]() |
![]() |
![]() |
| Quad 二次曲线 |
![]() |
![]() |
![]() |
-- | Cubic 三次曲线 |
![]() |
![]() |
![]() |
| Quart 四次曲线 |
![]() |
![]() |
![]() |
-- | Quint 五次曲线 |
![]() |
![]() |
![]() |
| Expo 指数曲线 |
![]() |
![]() |
![]() |
-- | Circ 圆形曲线 |
![]() |
![]() |
![]() |
| Elastic 弹性曲线 |
![]() |
![]() |
![]() |
-- | Back 回退曲线 |
![]() |
![]() |
![]() |
| Bounce 弹跳曲线 |
![]() |
![]() |
![]() |
| 序号 | 类名称 | 分类 |
|---|---|---|
| ✅ | XTween.Alpha |
透明度动画 |
| ✅ | XTween.AnchoredPosition |
锚点位置动画 |
| ✅ | XTween.Color |
颜色动画 |
| ✅ | XTween.Fill |
填充动画 |
| ✅ | XTween.Path |
路径动画 |
| ✅ | XTween.Rotation |
旋转动画 |
| ✅ | XTween.Scale |
缩放动画 |
| ✅ | XTween.Shake |
抖动动画 |
| ✅ | XTween.Size |
尺寸动画 |
| ✅ | XTween.Text |
文本动画 |
| ✅ | XTween.Tiled |
平铺动画 |
| ✅ | XTween.TmpText |
TMP文本动画 |
| ✅ | XTween.To.Color |
颜色过渡 |
| ✅ | XTween.To_Float |
浮点数过渡 |
| ✅ | XTween.To_Int |
整数过渡 |
| ✅ | XTween.To.String |
字符串过渡 |
| ✅ | XTween.To.Vector2 |
二维向量过渡 |
| ✅ | XTween.To.Vector3 |
三维向量过渡 |
| ✅ | XTween.To.Vector4 |
四维向量过渡 |
flowchart LR
%% ===== 核心流程 =====
A([创建 / Tween_Create]) --> B([播放 / Tween_Play])
B --> C{用户操作}
C -->|暂停| D([暂停 / Tween_Pause])
D -->|继续| B
C -->|重播| E([重播 / Tween_Replay])
E --> B
C -->|停止| F([停止 / Tween_Stop])
F --> G([销毁 / Tween_Kill])
G --> H[对象池回收]
%% ===== 循环路径 =====
H -.->|复用| A
%% ===== 样式定义 =====
classDef process fill:#8bffc4,stroke:#ffffff00,stroke-width:2px,rx:8px,ry:8px
classDef decision fill:#ff9966,stroke:#fbbc0400
classDef endpoint fill:#5AB2F6,stroke:#4285f400,rx:8px,ry:8px
class A,B,D,E,F,G process
class C decision
class H endpoint
%% ===== 方法名样式 =====
classDef method font-style:normal,font-size:20px,color:#000000
class A,B,C,D,E,F,G,H method
flowchart LR
%% ===== 核心流程 =====
A([初始化 / PreloadAll]) --> B([创建 / CreateTween])
B --> C{池中可用?}
C -->|是| D[从池中取出]
C -->|否| E{AutoExpand?}
E -->|是| F[扩容池]
E -->|否| G[返回null/警告]
F --> D
D --> H([使用 / RegisterTween])
H --> I{用户操作}
I -->|完成| J([回收 / RecycleTween])
I -->|强制回收| K([ForceRecycleAll])
J --> B
K --> J
%% ===== 统计路径 =====
B --> L([统计 / Count_Created++])
J --> M([统计 / Count_Created--])
A --> N([统计 / Count_Preloaded初始化])
%% ===== 样式定义 =====
classDef process fill:#8bffc4,stroke:#ffffff00,stroke-width:2px,rx:8px,ry:8px
classDef decision fill:#ff9966,stroke:#fbbc0400
classDef endpoint fill:#5AB2F6,stroke:#4285f400,rx:8px,ry:8px
classDef stat fill:#ffccf9,stroke:#ffffff00
class A,B,D,F,H,J,K process
class C,E decision
class G endpoint
class L,M,N stat
%% ===== 方法名样式 =====
classDef method font-style:normal,font-size:20px,color:#000000
class A,B,C,D,E,F,G,H method
%% ===== 特殊说明 =====
click A "javascript:alert('预加载所有类型动画')"
click B "javascript:alert('从池获取/创建新实例')"
click J "javascript:alert('重置状态后回收入池')"
click K "javascript:alert('强制终止并回收所有动画')"
flowchart LR
%% ===== 核心流程 =====
A([初始化 / Manager_Awake]) --> B([注册 / RegisterTween])
B --> C{动画状态}
C -->|播放| D([更新 / UpdateActiveTweens])
C -->|暂停| E([暂停 / Tween_Pause])
E -->|继续| D
C -->|完成| F([回收 / UnregisterTween])
F --> G([对象池回收])
C -->|强制终止| H([批量清理 / Kill_All])
%% ===== 管理循环 =====
D --> C
G -.->|复用| B
%% ===== 样式定义 =====
classDef process fill:#8bffc4,stroke:#ffffff00,stroke-width:2px,rx:8px,ry:8px
classDef decision fill:#ff9966,stroke:#fbbc0400
classDef endpoint fill:#5AB2F6,stroke:#4285f400,rx:8px,ry:8px
class A,B,D,E,F process
class C decision
class G,H endpoint
%% ===== 方法名样式 =====
classDef method font-style:normal,font-size:20px,color:#000000
class A,B,C,D,E,F,G,H method
%% ===== 特殊说明 =====
click A "javascript:alert('单例初始化+预加载池')"
click D "javascript:alert('每帧更新+迭代器缓存优化')"
click F "javascript:alert('清理索引+移入待处理队列')"
flowchart LR
%% ===== 核心流程 =====
A([初始化 / Initialize]) --> B([添加动画 / Append])
B --> C([准备播放 / Prepare])
C --> D([播放 / Play])
D --> E{动画状态}
E -->|播放中| F([更新 / Update])
E -->|完成| G([自动终止 / AutoKill])
E -->|用户操作| H{控制指令}
%% ===== 控制分支 =====
H -->|倒带| I([Rewind])
H -->|终止| J([Kill])
H -->|清空| K([Clear])
%% ===== 循环路径 =====
I --> D
J --> B
K --> B
G --> B
%% ===== 样式定义 =====
classDef process fill:#8bffc4,stroke:#ffffff00,stroke-width:2px,rx:8px,ry:8px
classDef decision fill:#ff9966,stroke:#fbbc0400
classDef endpoint fill:#5AB2F6,stroke:#4285f400,rx:8px,ry:8px
class A,B,C,D,F,G,I,J,K process
class E,H decision
%% ===== 方法名样式 =====
classDef method font-style:normal,font-size:20px,color:#000000
class A,B,C,D,E,F,G,H method
%% ===== 特殊说明 =====
click A "javascript:alert('静态初始化+注册编辑器更新事件')"
click F "javascript:alert('每帧检测:\\n1. 自动停止条件\\n2. 动画状态更新\\n3. 场景重绘')"
click G "javascript:alert('触发条件:\\n1. 达到MaxTotalDuration\\n2. 所有动画完成')"
flowchart TB
%% ===== 核心继承结构 =====
A([XTween_Base<T>]) -->|抽象基类| B[核心生命周期]
A --> C[通用功能]
A --> D[模板方法]
%% ===== 具体实现类 =====
B --> E([Specialized Float])
B --> F([Specialized Int])
B --> G([Specialized Color])
B --> H([Specialized Vector2/3/4])
B --> I([Specialized Quaternion])
B --> J([Specialized String])
%% ===== 方法实现差异 =====
E -->|Mathf.Lerp| K[数值插值]
F -->|RoundToInt| L[整数处理]
G -->|Color.Lerp| M[颜色过渡]
H -->|Vector.Lerp| N[向量运算]
I -->|Quaternion.Slerp| O[旋转插值]
J -->|Substring| P[字符动画]
%% ===== 样式定义 =====
classDef abstract fill:#8bffc4,stroke:#388E3C,color:white,rx:8px,ry:8px,font-style:normal,font-size:20px,color:#000000
classDef concrete fill:#5AB2F6,stroke:#1565C0,rx:8px,ry:8px,font-style:normal,font-size:20px,color:#000000
classDef method fill:#FF9800,stroke:#F57C00,rx:8px,ry:8px,font-style:normal,font-size:16px,color:#000000
class A abstract
class E,F,G,H,I,J concrete
class K,L,M,N,O,P method
%% ===== 交互说明 =====
click A "javascript:alert('提供核心生命周期管理\\n- Play/Pause/Kill\\n- 进度计算\\n- 回调系统')"
click E "javascript:alert('Float特性:\\n- 精确浮点计算\\n- 支持所有缓动模式')"
click J "javascript:alert('String特性:\\n- 字符逐显效果\\n- 特殊进度计算')"



































