跳转至

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_InnerMesh_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 里把某个状态机连线的条件改一下,看看游戏里发生了什么变化。这是最快的学习方式。