跳转至

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 状态(显示)

参数定义

VRCExpressionParameters:
  taozhuang: Int, saved=true, default=0

值映射(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,全部 OverridewriteDefaultValues=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 命令"。

脚本要做的事

  1. 读取 FX ControllerAssetDatabase.LoadAssetAtPath<AnimatorController>
  2. 添加 taozhuang Int 参数AddParameter
  3. 为每套衣服创建一个 LayerAddLayer),对应 V3 Layer 18-21
  4. 每个 Layer 创建 4 个状态(A_Closed/B_Appearing/C_Opened/D_Disappearing),设 motion
  5. 设置过渡条件taozhuang == N, taozhuang != N, HasExitTime)
  6. 设 Transition Duration(溶解动画时长)
  7. 添加打断保护过渡(B_Appearing → A_Closed 和 D_Disappearing → C_Opened)
  8. 更新 VRCExpressionParameters(添加 Int 参数 taozhuang
  9. 更新菜单(添加 Button 或 SubMenu) C_Opened)
  10. 更新 VRCExpressionParameters(添加 Int 参数 taozhuang
  11. 更新菜单(添加 Button 或 SubMenu)### 需要提前确认的信息

  12. 4 套衣服的名字(yuanpi / mox / xiuxian / ksmy)

  13. ON/OFF AnimationClip 的路径和文件名
  14. FX Controller 的路径(Cazalis_FX_Modified_V3.controller
  15. VRCExpressionParameters 的路径
  16. VRCExpressionsMenu 的路径
  17. Transition Duration(溶解过渡时长,秒)

相关笔记

  • [[dissolve-transition-system-cazalis]] — Cazalis V3 项目的溶解系统(本文档 V3 版)
  • [[multi-outfit-system]] — 多套衣服更换架构(旧方案对比)