title: 换装与动画原理 (Avatar 3.0 & Animator) description: 状态机、参数传递、Layer Mask、以及 VRChat 换装的底层逻辑
换装与动画原理 (Avatar 3.0 & Animator)
VRChat 的换装并不是“保存”了不同的衣服模型,而是通过实时计算来控制部件的显示与隐藏。这完全依赖于 Unity 强大的 Mecanim 动画系统。
1. 核心组件:Animator Controller (动画控制器)
这是模型的“大脑”。它由以下三部分组成:
A. Parameters (参数)
这是模型的“神经系统”。菜单的点击、手指的动作、面捕的数据,最终都会转化为这些参数的变化。
- Bool: 开关状态 (如 IsOuterOn = true/false)
- Int: 多个选项 (如 SkirtType = 0, 1, 2)
- Float: 连续数值 (如 HandCurl = 0.0 ~ 1.0)
B. States (状态)
一个状态通常对应一段动画 (Animation Clip)。
- 待机 (Idle):什么都不做时的呼吸动画。
- 动作 (Action):走路、跑步、提裙行礼等。
- 特殊 (Special):如“穿外套”状态,此时外套网格的 Active 被设为 True。
C. Transitions (过渡连线)
连接状态的“血管”。上面定义了切换条件。
- 逻辑示例:当 SkirtType == 1 时,从 State_SkirtA 切换到 State_SkirtB。
- Has Exit Time:如果勾选,必须播完当前动画才能切换;如果不勾选,可以随时打断(常用于攻击或紧急动作)。
2. VRChat 的图层系统 (Avatar 3.0 Layers)
VRChat 强制将动画分为了几个独立的层,互不干扰:
| 层级名称 | 作用 | 换装/交互应用 |
|---|---|---|
| Base Layer | 基础运动 | 走路、跑步、跳跃。不要在这里做换装逻辑。 |
| Additive Layer | 叠加运动 | 在跑步的同时,上半身做抱胸动作。使用 Avatar Mask 只影响上半身。 |
| Gesture Layer | 手势 | 手指追踪、手势识别。 |
| Action Layer | 动作交互 | 坐姿、躺姿。通常覆盖全身。 |
| FX Layer (重点) | 特效与换装 | 所有的衣服开关、道具显示、面捕表情都在这里! |
💡 关键结论:你在菜单里点的每一个“换装”按钮,控制的都是 FX Layer。
3. 换装的底层实现逻辑
当你按下“穿外套”时,Unity 内部发生了什么? !** |
💡 关键结论:你在菜单里点的每一个“换装”按钮,控制的都是 FX Layer。
3. 换装的底层实现逻辑
当你按下“穿外套”时,Unity 内部发生了什么?### 方案 A:GameObject 切换 (最常见)
- Unity 结构:模型下有两个子节点 Mesh_Inner 和 Mesh_Outer。
- 动画逻辑:在 FX Layer 的动画帧里,使用 SetActive 曲线。
- 第 0 帧:Mesh_Outer = False, Mesh_Inner = True
- 第 1 帧:Mesh_Outer = True, Mesh_Inner = False
- 优势:简单,性能开销小。
方案 B:BlendShape 形变 (高级)
- 原理:衣服和皮肤共用同一个 Mesh。
- 动画逻辑:当穿上紧身衣时,将身体对应部位的 BlendShape (如
Hide_Arms) 拉到 100%。这会让胳膊的网格缩小,从而避免与衣服重叠。 - 优势:防穿模效果最好,但制作极其复杂。
4. 防穿模的终极奥义 (Avatar Mask & Clipping Fix)
为什么换装容易穿模?
因为外套和里面的衬衫是两个独立的网格。如果它们距离太近,GPU 渲染时会发生 Z-fighting (闪烁) 或透出皮肤。
解决方案:隐形内衬 (The Inner Body)
高级模型(如 Cazalis)通常在“外套”里面还藏了一件“隐形打底衫”。
1. 状态机逻辑:
- 外套关 -> 显示 真实皮肤
- 外套开 -> 隐藏 真实皮肤, 显示 隐形打底衫 + 外套
2. 隐形打底衫:
- 材质是透明的 (或只有内面有贴图)。
- 它的网格比真实皮肤稍微大一点点,完美填补了外套和身体之间的缝隙。
5. 学习路线图
想要掌握换装,请按以下顺序研究 Cazalis 的 Animator:
1. 找到 FX Layer:看懂那些长长的连线和 Bool 参数。
2. 观察动画帧:双击进入某个状态,看 Inspector 里的 Properties。你会看到 Mesh_Outer 旁边有一个关键帧打钩了。
3. 尝试修改:在 Unity 里把某个状态机连线的条件改一下,看看游戏里发生了什么变化。这是最快的学习方式。