title: Int参数4状态循环换衣方案(互斥+溶解过渡) description: V3版 — 基于 taozhuang 参数的4状态循环换衣系统 created: 2026-05-13 updated: 2026-05-14 type: guide tags: [vrchat, avatar, outfit, int-parameter, dissolve, 4-state, exclusive, v3, taozhuang]
Int参数4状态循环换衣方案(互斥+溶解过渡)
[!NOTE] 本文档为 V3 版本,参数已更新为
taozhuang(原Clothes已废弃)。 适用于Cazalis_FX_Modified_V3.controller(Layer 18-21)。
核心架构
每件/每套衣服单独一个 Animator Layer
一个 Int 参数控制所有衣服
每个 Layer 4 状态循环:A_Closed → B_Appearing → C_Opened → D_Disappearing → A_Closed
Int 参数的值决定了哪个衣服在 C_Opened 状态(显示)
参数定义
值映射(V3 4件衣服):
- 0 = 原皮(yuanpi)
- 1 = 露肩短裙(mox)
- 2 = 休闲服(xiuxian)
- 3 = 开衫毛衣(ksmy)
[!WARNING] V3 只有 4 件衣服(0-3),不含"裸体"选项。如需裸体功能,需额外 Bool 参数控制原皮显隐。
菜单(Button):
SubMenu "换装":
Button "原皮" → taozhuang=0
Button "露肩短裙" → taozhuang=1
Button "休闲服" → taozhuang=2
Button "开衫毛衣" → taozhuang=3
Animator Layer 结构
每套衣服独立一个 Layer,全部 Override,writeDefaultValues=false。
V3 中 Layer 18-21 分别对应 yuanpi、mox、xiuxian、ksmy,共用同一个
taozhuang参数驱动。writeDefaultValues=false。V3 中 Layer 18-21 分别对应 yuanpi、mox、xiuxian、ksmy,共用同一个
taozhuang参数驱动。### 4 个状态(V3 标准命名)
| 状态 | motion | 说明 |
|---|---|---|
| A_Closed(已关闭) | OFF.anim | 进入就播OFF.anim,播完停在这。衣服已隐藏。 |
| B_Appearing(出现中) | ON.anim | taozhuang == N 触发。播ON.anim(瞬间显现)+ Transition Duration 产生溶解渐入效果。播完自动进 C_Opened。 |
| C_Opened(开启中) | ON.anim | Idle 状态,衣服保持在显示状态。等待 taozhuang != N 触发。 |
| D_Disappearing(消失中) | OFF.anim | taozhuang != N 触发。播OFF.anim(溶解消失+关掉),Transition Duration 产生溶解渐出效果。播完自动回 A_Closed。 |
旧版命名(已废弃):Hide → Appear → Show → Disappear → 请统一使用 V3 标准:A_Closed / B_Appearing / C_Opened / D_Disappearing
过渡条件
| 从 | 到 | 条件 | HasExitTime | Duration | 说明 |
|---|---|---|---|---|---|
| A_Closed | B_Appearing | taozhuang == N |
❌ | 溶解时长 | 正常穿衣 |
| B_Appearing | C_Opened | — | ✅ 自动 | 0 | 出现播完,保持显示 |
| C_Opened | D_Disappearing | taozhuang != N |
❌ | 溶解时长 | 正常脱衣 |
| D_Disappearing | A_Closed | — | ✅ 自动 | 0 | 消失播完,回到隐藏 |
打断保护(快速切换)
当快速连点时(溶解动画还没播完就切换),需要打断机制:
| 当前状态 | 条件 | 跳转到 | 效果 |
|---|---|---|---|
| B_Appearing(出现中) | taozhuang != N |
A_Closed(已关闭) | 穿衣被打断,瞬间隐藏 |
| D_Disappearing(消失中) | taozhuang == N |
C_Opened(开启中) | 脱衣被打断,瞬间显示 |
实现方式:在 B_Appearing 状态添加一条到 A_Closed 的过渡,条件 taozhuang != N;在 D_Disappearing 状态添加一条到 C_Opened 的过渡,条件 taozhuang == N。打断过渡的优先级高于正常过渡。
ed 的过渡,条件 taozhuang != N;在 D_Disappearing 状态添加一条到 C_Opened 的过渡,条件 taozhuang == N。打断过渡的优先级高于正常过渡。### 关键原理
为什么不会打架?
当 taozhuang 从 1 变到 3 时:
| 衣服 | 原状态 | 触发 | 新状态 |
|---|---|---|---|
| 露肩短裙(mox) | C_Opened(显示) | taozhuang != 1 → 触发 |
D_Disappearing → 回 A_Closed |
| 休闲服(xiuxian) | A_Closed(隐藏) | taozhuang != 3,但A_Closed 只响应 taozhuang == 2 |
保持 A_Closed,不动 |
| 开衫毛衣(ksmy) | A_Closed(隐藏) | taozhuang == 3 → 触发 |
B_Appearing → C_Opened |
| 原皮(yuanpi) | A_Closed(隐藏) | taozhuang != 3,但A_Closed 只响应 taozhuang == 0 |
保持 A_Closed,不动 |
重点:A_Closed 状态(已关闭)只有一条出去的过渡——taozhuang == N。 taozhuang != 某值 在 A_Closed 状态没有任何反应,所以其他衣服完全不会误触发。
素材要求
每套衣服需要两个 AnimationClip:
- ON.anim:1帧
_DissolveParams.z = -0.5(完全显现)-
m_IsActive = 1 -
OFF.anim:2帧
- 第1帧
_DissolveParams.z = 1.7(溶解消失) - 第2帧
m_IsActive = 0
溶解过渡的效果由 Animator 状态间的 Transition Duration 实现,不是靠 clip 自身。
V3 Clip 路径
| 衣服 | taozhuang 值 | ON Clip | OFF Clip |
|---|---|---|---|
| 原皮 | 0 | yuanpi_ON.anim |
yuanpi_OFF.anim |
| 露肩短裙 | 1 | mox_ON.anim |
mox_OFF.anim |
| 休闲服 | 2 | xiuxian_ON.anim |
xiuxian_OFF.anim |
| 开衫毛衣 | 3 | ksmy_ON.anim |
ksmy_OFF.anim |
Clip 存放路径:Assets/Cazalis/Animation/FX/yuanpi/ / mox/ / xiuxian/ / ksmy/
| ksmy_OFF.anim |
Clip 存放路径:Assets/Cazalis/Animation/FX/yuanpi/ / mox/ / xiuxian/ / ksmy/## 注意事项
- 所有衣服的根骨骼必须一致,否则坐标模式下即使参数相同也会因为根骨骼位置不同而溶解边界不一致
- ON/OFF clip 中的
m_IsActive控制由该 Layer 负责,其他 Layer 不干涉 writeDefaultValues=false保证每个 Layer 只控制自己的衣服,不影响其他 Layer- 需要预留 VRCExpressionParameters 中 Int 参数的位(占用 1 个 Int 槽位,8 bit)
- V3 Controller:
Cazalis_FX_Modified_V3.controller,Layer 18-21
与独立 Bool Toggle 方案的区别
| 方案 | 互斥性 | 参数占用 | 参数数量 | 实现复杂度 |
|---|---|---|---|---|
| 独立 Bool | 需额外逻辑保证 | N 个 Bool | 4+ | 低 |
| Int 4状态 | 天然互斥 | 1 个 Int | 1 | 中(4个Layer) |
落地实现方案
MCP execute_code 跑 C# Editor 脚本
Unity MCP 的 execute_code 使用 Roslyn C# 编译器,可以执行任意 C# 代码操作 Unity Editor API——包括创建/修改 AnimatorController、VRCExpressionParameters、VRCExpressionsMenu。
这和写 Editor 脚本完全一样的能力,不是"转成 MCP 命令"。
脚本要做的事
- 读取 FX Controller(
AssetDatabase.LoadAssetAtPath<AnimatorController>) - 添加
taozhuangInt 参数(AddParameter) - 为每套衣服创建一个 Layer(
AddLayer),对应 V3 Layer 18-21 - 每个 Layer 创建 4 个状态(A_Closed/B_Appearing/C_Opened/D_Disappearing),设 motion
- 设置过渡条件(
taozhuang == N,taozhuang != N, HasExitTime) - 设 Transition Duration(溶解动画时长)
- 添加打断保护过渡(B_Appearing → A_Closed 和 D_Disappearing → C_Opened)
- 更新 VRCExpressionParameters(添加 Int 参数
taozhuang) - 更新菜单(添加 Button 或 SubMenu) C_Opened)
- 更新 VRCExpressionParameters(添加 Int 参数
taozhuang) -
更新菜单(添加 Button 或 SubMenu)### 需要提前确认的信息
-
4 套衣服的名字(yuanpi / mox / xiuxian / ksmy)
- ON/OFF AnimationClip 的路径和文件名
- FX Controller 的路径(
Cazalis_FX_Modified_V3.controller) - VRCExpressionParameters 的路径
- VRCExpressionsMenu 的路径
- Transition Duration(溶解过渡时长,秒)
相关笔记
- [[dissolve-transition-system-cazalis]] — Cazalis V3 项目的溶解系统(本文档 V3 版)
- [[multi-outfit-system]] — 多套衣服更换架构(旧方案对比)