name: cazalis-dissolve-system-v3 description: Cazalis zigai 7套衣服溶解换衣系统的最终工作版本(V3 FX Controller),含完整的4状态循环架构、clip对应关系、wd配置、Shorts/Bra/Foot_Heel规则、多Avatar架构、以及部署验证要点 category: vrchat
Cazalis 溶解换衣系统 V3(最终版)
7套衣服一览
| # | 名称 | taozhuang值 | Layer |
|---|---|---|---|
| 0 | 原皮 | 0 | 18 |
| 1 | 露肩短裙 | 1 | 19 |
| 2 | 休闲服 | 2 | 20 |
| 3 | 开衫毛衣 | 3 | 21 |
| 4 | 娃花 | 4 | 22 |
| 5 | Blanchir | 5 | 25 |
| 6 | HonmeiKnit(01_Black) | 6 | 27 |
FX Controller 文件
- 文件:
Cazalis_FX_Modified_V3.controller - 路径:
Assets/ALCOM/project/Cazalis/Assets/Cazalis/Animation/FX/Cazalis_FX_Modified_V3.controller - 祖版: 从
Cazalis_FX.controller(原版)复制并修改
Layer 结构
| Index | 名称 | 来源 | 类型 | wd |
|---|---|---|---|---|
| 0-12 | (原版手势/眨眼/表情/蝴蝶等) | 原版 | - | - |
| 13 | Option | 原版复制 | Direct BlendTree, 4子项 | true |
| 14 | Hair_Face_Options | 原版复制 | Direct BlendTree, 7子项 | true |
| 15 | Face_Option | 原版复制 | 5状态(Idle/Deformer/Adult/Loli/OFF) | true |
| 16 | Cloth_Option | 原版复制 | Direct BlendTree, 6子项 | true |
| 17 | Dress_ON | 原版复制 | 2状态 | true |
| 18 | 4S_Origin | 新建 | 4状态循环 | A=true / BCD=false |
| 19 | 4S_Lujian | 新建 | 4状态循环 | A=true / BCD=false |
| 20 | 4S_Casual | 新建 | 4状态循环 | A=true / BCD=false |
| 21 | 4S_Cardigan | 新建 | 4状态循环 | A=true / BCD=false |
| 22 | 4S_Wahua | 新建 | 4状态循环 | A=true / BCD=false |
| 25 | 4S_Blanchir | 新建 | 4状态循环 | A=OFF clip / BCD=false |
| 26 | 4S_Underwear | 新建 | 2状态(Hide/ShowShorts) | Override, weight=1.0 |
| =OFF clip / BCD=false | ||||
| 26 | 4S_Underwear | 新建 | 2状态(Hide/ShowShorts) | Override, weight=1.0 |
- A_Closed 的 writeDefaultValues = true(Hide clip 恒定值,归零安全) |
||||
- B/C/D 的 writeDefaultValues = false |
||||
- 核心参数: taozhuang (Int) |
||||
| - Transition Duration: 1.1秒(2026-05-28 从1.2s改为1.1s,5套统一) |
Clip 对应关系
| 层 | 衣服 | ON clip | OFF clip | Hide clip | 文件修改时间 |
|---|---|---|---|---|---|
| 18 | 原皮 | yuanpi_ON.anim |
yuanpi_OFF.anim |
yuanpi_Hide.anim |
05-12 |
| 19 | 露肩短裙 | mox_ON.anim |
mox_OFF.anim |
mox_Hide.anim |
05-13/14 |
| 20 | 休闲服 | xiuxian_ON.anim |
xiuxian_OFF.anim |
xiuxian_Hide.anim |
05-13 |
| 21 | 开衫毛衣 | ksmy_ON.anim |
ksmy_OFF.anim |
ksmy_Hide.anim |
05-13 |
| 22 | 娃花 | wahua_ON.anim |
wahua_OFF.anim |
wahua_Hide.anim |
- |
| 25 | Blanchir | blanchir_ON.anim |
blanchir_OFF.anim |
blanchir_Hide.anim |
05-27 |
| 26 | 内衣控制 | Underwear_ShowShorts.anim |
Underwear_Hide.anim |
- | 05-28 |
- 所有 ON/OFF clip 是 1帧固定值(ON设z=-0.5, OFF设z=1.7)+
m_IsActive控制 - 溶解效果由 Transition Duration 1秒 + Unity 动画插值产生
是 1帧固定值(ON设z=-0.5, OFF设z=1.7)+
m_IsActive控制 - 溶解效果由 Transition Duration 1秒 + Unity 动画插值产生## ⚠️ 实际 wd 配置(与理论不同)
实测发现:现有5套衣服的4S层 A_Closed 实际使用 OFF clip + wd=false(不是理论推荐的 Hide clip + wd=true)。 - 这与 skill 中的理论推荐(A=Hide+wd=true)不同 - Blanchir 新层按照现有4套的实际做法配置(A=OFF clip + wd=false) - 原因:现有4套动画和层的配置已经在 VRChat 中验证正常工作,新层应与现有保持一致
Blanchir 套装详情(2026-05-27 新增)
- SMR 路径:
Blanchir_Cazalis/Blanchir_inner,Blanchir_Cazalis/Blanchir_skirt,Blanchir_Cazalis/Blanchir_top - 材质:
Assets/Cazalis/Qukumu/Blanchir/Cazalis/Data/blanchir Cazalis.mat - 材质配置: _DissolveParams=(2,0,1.7,0), _DissolvePos=(0,1,0,0), _DissolveNoiseMask=Cazalis_Reflection_Noise, _DissolveNoiseStrength=0.3, _DissolveColor=(0.22,0.48,0.91,1)
- 动画目录:
Assets/Cazalis/Animation/FX/(Blanchir_ON.anim/Blanchir_OFF.anim/Blanchir_Hide.anim,大写B) - taozhuang 值: 5
- 菜单名: 绑带上衣(原英文名 Blanchir 已改名)
- 菜单图标:
Assets/Auto_Iron/blanchir.png(GUID=5db9f00dca0ac3240bf9abf2ffac4837, 512×512) - Boots ShapeChanger: 已补全 ModularAvatarShapeChanger(3个blendshape: Shrink_Toe/Shrink_Foot/Shrink_Ankle=100, refPath=Body_Base, ChangeType=Set) apeChanger(3个blendshape: Shrink_Toe/Shrink_Foot/Shrink_Ankle=100, refPath=Body_Base, ChangeType=Set)## ⚠️ PhysBone 飘动失灵 — 常见原因
衣服切换后 PhysBone 不飘动的排查清单:
原因 1:ON clip 缺少 PB/m_IsActive = 1 曲线
- Cloud 组衣服的 PhysBone 全部挂在 Cloud/PB/ 子节点下(Outer_Waist_*、Outer_Ribbon*、Neck_Ribbon、Boots_Ribbon*、Upper_leg_Ribbon* 等)
- OFF clip 会设 Cloud/PB/m_IsActive = 0
- 如果 ON clip 没有对应设 Cloud/PB/m_IsActive = 1,切换回来后 PB 节点是关的,物理不工作
- 同理检查 Cloud/Armature/m_IsActive、Cloud/Collider/m_IsActive
- 已验证:yuanpi_ON.anim 和 xiuxian_ON.anim 容易遗漏这条曲线
原因 2:wd=true 的旧 Layer 干扰 - 原版 Layer 13 Dress_ON 是 wd=true,如果它和 4S 层同时输出,可能覆盖衣服状态 - 检查所有 wd=true 的 Layer 是否也控制了你衣服的 GameObject
原因 3:isAnimated 参数没设
- 每个衣服集的 PhysBone isAnimated = False(默认值)— 如果不需要动画控制器控制 PhysBone 参数,保持 false 即可
修复方法:在 Unity 中打开缺失曲线的 ON clip,添加 Cloud/PB → m_IsActive = true 的关键帧。
🔴 Shorts/Bra 显隐规则(2026-05-28 重构)
核心架构变更:Shorts/Bra 不再由各衣服的 ON/OFF clip 控制,改为由 Layer 26 (4S_Underwear) 统一管理,消除多层 Override 冲突。
多层 Override 冲突问题(已解决)
根因:5个衣服层都是 Override 模式,每个层的 OFF clip 都写了 Shorts/Bra 的隐藏值。当原皮/抹胸层用 ON clip 显示 Shorts 时,其他未激活层的 OFF clip 在后面覆盖了 ON clip 的值,导致 Shorts 不可见。
修复:从所有10个 ON/OFF clip 移除 Shorts/Bra 曲线(40条),新建专用 4S_Underwear 层统一控制。 ON clip 的值,导致 Shorts 不可见。
修复:从所有10个 ON/OFF clip 移除 Shorts/Bra 曲线(40条),新建专用 4S_Underwear 层统一控制。### Layer 26 (4S_Underwear) 架构
- Hide 状态:Shorts m_IsActive=0 + z=1.7, Bra m_IsActive=0 + z=1.7 - ShowShorts 状态:Shorts m_IsActive=1 + z=-0.5, Bra m_IsActive=0 + z=1.7 - 过渡条件: - Hide → ShowShorts:taozhuang == 0 (原皮) / taozhuang == 1 (抹胸) / taozhuang == 5 (绑带上衣)
- ShowShorts → Hide: taozhuang == 2 (休闲) / taozhuang == 3 (开衫) / taozhuang == 4 (全脱)
- blendingMode: Override
- defaultWeight: 1.0(⚠️ 创建时默认为0,必须手动设为1.0)
- 过渡时间: 1.1s(与衣服溶解同步)
显隐对照表
| # | 衣服 | taozhuang | Shorts | Bra | Layer 26 状态 |
|---|---|---|---|---|---|
| 0 | 原皮 | 0 | ✅ | ❌ | ShowShorts |
| 1 | 露肩短裙 | 1 | ✅ | ❌ | ShowShorts |
| 2 | 休闲服 | 2 | ❌ | ❌ | Hide |
| 3 | 开衫毛衣 | 3 | ❌ | ❌ | Hide |
| 4 | 全脱 | 4 | ❌ | ❌ | Hide |
| 5 | 绑带上衣 | 5 | ✅ | ❌ | ShowShorts |
动画剪辑
Underwear_Hide.anim— Shorts a=0 z=1.7, Bra a=0 z=1.7Underwear_ShowShorts.anim— Shorts a=1 z=-0.5, Bra a=0 z=1.7
🔴 Foot_Heel Blendshape 规则(2026-05-27 确认)
Foot_Heel blendshape 值由各衣服 ON 动画设定:
| # | 衣服 | Foot_Heel值 | 含义 |
|---|---|---|---|
| 0 | 原皮 | 100 | 高跟鞋 |
| 1 | 露肩短裙 | 100 | 高跟鞋 |
| 2 | 休闲服 | 0 | 平底鞋 |
| 3 | 开衫毛衣 | 100 | 高跟鞋 |
| 4 | 娃花 | 100 | 高跟鞋 |
| 5 | Blanchir | 100 | 高跟鞋 |
🔴 材质 Alpha 蒙版陷阱(2026-05-27 发现)
Shorts 材质的 Alpha 蒙版模式必须设为"无"(None),绝不能设为"替换"(Replace)!
- 设为"替换" → Shorts 完全透明不可见
- 设为"无" → 正常显示
-
此规则可能适用于其他使用 lilToon 的半透明衣物材质,遇到透明度异常时优先检查此设置 eplace)!**
-
设为"替换" → Shorts 完全透明不可见
- 设为"无" → 正常显示
-
此规则可能适用于其他使用 lilToon 的半透明衣物材质,遇到透明度异常时优先检查此设置## Blanchir 飘带骨骼与材质(2026-05-27 新增)
-
飘带骨骼:从 Chic 复制到 Blanchir
Armature.1,共 8个根骨骼 + 28个 PB 节点 - Boots 材质:已独立复制到 Blanchir 专属目录(不共用 Chic 原版材质)
- Chic 原版材质:已还原,未被 Blanchir 修改污染
已解决问题(2026-05-28)
露肩短裙/原皮 Shorts 不显示— 根因:多层Override冲突,多个4S层的OFF clip同时写Shorts/Bra值,后面的层覆盖前面。修复:移除各层ON/OFF clip中的Shorts/Bra曲线,新建Layer 26(4S_Underwear)统一管理Layer 26 weight=0 不生效— 新建Layer时defaultWeight默认为0,通过创建新AnimatorControllerLayer副本设defaultWeight=1.0替换原层解决 weight=0 不生效**~~ — 新建Layer时defaultWeight默认为0,通过创建新AnimatorControllerLayer副本设defaultWeight=1.0替换原层解决## 🔴 L25 4S_Blanchir StateMachine 丢失问题(2026-05-28 重点记录)
症状:打开 Unity 后 L25 4S_Blanchir 的 stateMachine 变为 NULL,控制台报 Statemachine for layer '4S_Blanchir' is missing + Animator Controller is not valid。
根因:AnimatorControllerLayer 是 struct,ctrl.layers[i] 返回的是副本。通过 C# API 修改层后,如果 SM 及其子对象(states、transitions)没有作为 sub-asset 注册到 .controller 文件,Unity 重新加载时会丢失引用。
修复方法(已验证成功持久化):
1. 创建 AnimatorStateMachine → 用 sm.AddState() 创建状态 → 设置 transitions
2. 创建新的 AnimatorControllerLayer struct,设置 stateMachine = sm, defaultWeight = 1f, blendingMode = Override
3. 关键:替换回 layers 数组:layers[25] = newLayer; ctrl.layers = layers;
4. EditorUtility.SetDirty(ctrl); AssetDatabase.SaveAssets();
5. 验证持久化:AssetDatabase.ImportAsset(path, ImportAssetOptions.ForceUpdate); 后重新 LoadAssetAtPath 检查 SM 是否仍非 NULL
6. 检查 sub-assets:LoadAllAssetRepresentationsAtPath 应包含 4S_Blanchir_SM
⚠️⚠️ CRITICAL WARNING:此问题一定会再次发生!每次打开 Unity 或 reload domain 后都必须第一时间验证 L25 SM 是否存在。如果再次丢失,立即用上述方法重建。不验证会导致 FX Controller 完全失效,全部动画报错。 Unity 或 reload domain 后都必须第一时间验证 L25 SM 是否存在。如果再次丢失,立即用上述方法重建。不验证会导致 FX Controller 完全失效,全部动画报错。快速重建代码模板:
var ctrl = AssetDatabase.LoadAssetAtPath<AnimatorController>("Assets/Cazalis/Animation/Animator/Cazalis_FX_Modified_V3.controller");
var sm = new AnimatorStateMachine(); sm.name = "4S_Blanchir_SM";
var aClosed = sm.AddState("A_Closed", new Vector3(200,0,0)); aClosed.motion = OFFclip; aClosed.writeDefaultValues = false;
var bAppearing = sm.AddState("B_Appearing", new Vector3(400,80,0)); bAppearing.motion = ONclip; bAppearing.writeDefaultValues = false;
var cOpened = sm.AddState("C_Opened", new Vector3(600,0,0)); cOpened.motion = ONclip; cOpened.writeDefaultValues = false;
var dDisappearing = sm.AddState("D_Disappearing", new Vector3(400,-80,0)); dDisappearing.motion = Hideclip; dDisappearing.writeDefaultValues = false;
sm.defaultState = aClosed;
// Transitions: A→B(taozhuang==5,1.1s), B→C(auto), B→A(taozhuang!=5), C→D(taozhuang!=5,1.1s), D→A(auto), D→C(taozhuang==5)
var layers = ctrl.layers; layers[25] = newLayer; ctrl.layers = layers;
- Blanchir Boots 脚部穿模 — 脚部 clipping 问题,可能需要调整 Boots mesh 或材质设置
- L25 4S_Blanchir SM 可能再次丢失 — 每次打开 Unity 需验证,如丢失按上述模板重建 脚部 clipping 问题,可能需要调整 Boots mesh 或材质设置
- L25 4S_Blanchir SM 可能再次丢失 — 每次打开 Unity 需验证,如丢失按上述模板重建## 关键陷阱
- VRCAvatarDescriptor vs Animator 组件不同步 — Avatar 的 FX 动画控制器是在 VRCAvatarDescriptor 上指定的。修改 Animator 组件上的控制器不生效。必须确认 VRCAvatarDescriptor 面板里的 FX Layer 指向正确版本。
- layers[li] 返回副本 — 通过 C# API 修改
ctrl.layers[li].stateMachine不生效,必须直接操作子资产(Sub-StateMachine objects)。 - A_Closed 必须 wd=true + Hide clip — A_Closed 用 Hide clip(1帧恒定值 z=1.7, w=0.1, m_IsActive=0)+ wd=true,这样进入 A 时属性被正确归零。如果用 OFF clip + wd=false,从 D→A 过渡结束后 dissolve 参数可能残留中间值。
Shorts/Bra OFF动画不控制显隐— 已重构为 Layer 26 (4S_Underwear) 统一管理,各衣服ON/OFF clip不再包含Shorts/Bra曲线- 材质Alpha蒙版"替换"导致透明 — lilToon材质的Alpha蒙版模式选"替换"会使对象完全透明不可见,必须选"无"。
- 材质复制原则 — 从其他服装复制部件,必须将材质复制到目标服装专属目录,绝对不能修改原服装原版材质,否则会影响原服装。
- 骨骼绑定原则 — 所有SkinnedMeshRenderer用到的骨骼必须存在于目标服装自己的Armature.1下,额外飘带/蝴蝶结骨骼必须完整复制过去,否则会导致null骨骼绑定,部件变形。
- 多层Override冲突 — 多个Override层同时写同一属性时,后面的层会覆盖前面的层的值。解决方案:将冲突属性提取到专用层统一管理,不在多个层中重复写入。
- 新建Layer的defaultWeight=0陷阱 — 通过C# API创建AnimatorControllerLayer时,defaultWeight默认为0,层不会生效。必须手动设为1.0。修复方法:创建新layer副本设defaultWeight=1,替换回layers数组。
- C# AddCondition需要3个参数 —
AddCondition(mode, threshold, parameterName)三参数,不能省略threshold。Unity 2022中AnimatorConditionMode枚举值:Equals=6, NotEqual=7(不是1/2)。 - 共享材质修改污染其他Avatar — 多Avatar共享FX Controller时,如果修改了某个Avatar的材质(如Shorts的_DissolveParams.z),会影响所有使用该材质的Avatar。必须先创建独立材质副本再修改,特别是溶解参数(z值)的变更。
- 精简Avatar必须保留taozhuang参数并设对默认值 — 共享FX Controller的换衣层(4S_HonmeiKnit等)依赖taozhuang参数。如果精简Params时删掉taozhuang,VRChat默认值=0,01_Black会被溶解隐藏。ZG_03 Controller的换衣层(4S_HonmeiKnit等)依赖taozhuang参数。如果精简Params时删掉taozhuang,VRChat默认值=0,01_Black会被溶解隐藏。ZG_03 Controller的换衣层(4S_HonmeiKnit等)依赖taozhuang参数。如果精简Params时删掉taozhuang,VRChat默认值=0,01_Black会被溶解隐藏。ZG_03必须保留taozhuang=default=6。
- obake nail类配件不需要菜单但必须保留在Avatar上 — 指甲等装饰性配件不参与换衣系统,没有菜单控件,但它们是Avatar外观的一部分,创建精简版时不应移除。
- 6套衣服实际含HonmeiKnit — taozhuang=6对应4S_HonmeiKnit层(01_Black套装),这是第6套衣服,之前的5套是0=原皮/1=露肩短裙/2=休闲服/3=开衫毛衣/5=Blanchir。4=娃花/4S_Wahua层存在但可能未使用。
- VRCExpressionParameters.Parameter字段 — 只有:name(String), valueType(ValueType), saved(Boolean), defaultValue(Single/float), networkSynced(Boolean)。没有localOnly字段。
- Instantiate后骨骼自动重绑 — 场景内Instantiate Avatar后,子对象的SkinnedMeshRenderer骨骼会自动指向新Avatar的Armature,不需要手动修复。 nstantiate后骨骼自动重绑** — 场景内Instantiate Avatar后,子对象的SkinnedMeshRenderer骨骼会自动指向新Avatar的Armature,不需要手动修复。## Avatar 信息
- 模型名: Cazalis zigai02
- Avatar 路径: Assets/Avatars/Cazalis zigai/Cazalis zigai02.prefab
- FX 控制器切换后可能需要 Refresh 才能看到效果
多 Avatar 架构(2026-06-02 确认)
项目内 3 个 Cazalis Avatar 共享 FX Controller,各自拥有独立 Params/Menu:
| Avatar | FX Controller | ExpressionParameters | ExpressionMenu | 专属资产目录 |
|---|---|---|---|---|
| ZG_01 | 共享 | Cazalis_Parameter_ZG_01.asset | Cazalis_Menu_ZG_01.asset | Assets/Cazalis_ZG_01_Assets/ |
| ZG_02 | 共享 | Cazalis_Parameter_ZG_02.asset | Cazalis_Menu_ZG_02.asset | Assets/Cazalis_ZG_02_Assets/ |
| ZG_03 | 共享 | Cazalis_Parameter_ZG_03.asset | Cazalis_Menu_ZG_03.asset | Assets/Cazalis_ZG_03_Assets/ |
- FX Controller 共享:
Assets/Cazalis/Animation/Animator/Cazalis_FX_Modified_V3.controller,所有换衣层仍存在,不使用的层因无对应服装对象而静默 - Params/Menu 独立:每个 Avatar 有自己的参数和菜单副本,可独立精简 X_Modified_V3.controller`,所有换衣层仍存在,不使用的层因无对应服装对象而静默
- Params/Menu 独立:每个 Avatar 有自己的参数和菜单副本,可独立精简### ZG_03 精简版 Avatar(2026-06-02 创建)
| 项目 | ZG_02(原版) | ZG_03(精简版) |
|---|---|---|
| 服装 | 5套可切换 | 仅 01_Black(常驻,taozhuang=6) |
| 子对象 | 22 | 18(含 obake nail) |
| 参数 | 37个 / 93 bits | 24个 / 73 bits |
| 菜单 | 8项(含换衣+配饰) | 6项(删换衣+配饰子菜单) |
| FX Controller | 共享 | 共享 |
| taozhuang | default=6 | default=6 |
| Shorts材质 | 共享(动画控制 z=1.7) | 独立副本(常驻显示 z=-0.5) |
ZG_03 保留的子对象:01_Black, Armature, Body, Body_Base, Cloth_Under_Shorts, 8个头发, obake nail cazalis_Red, PlaneCollider, Anchor Target, Butterfly, GoGo Loco Beyond
ZG_03 删除的参数:Bra_ON, Dress_ON, DressSkirt_ON, Pumps_ON, Socks_ON, Origin/Lujian/Casual/Cardigan_ON, taozhuang(后加回,default=6), Wardrobe_Int1, WardrobeParts_0/1, Shorts_ON
ZG_03 删除的菜单项:换衣子菜单、配饰子菜单
Wiki 审查结果(2026-05-15)
- VRChat 44篇文档中33篇无需修改,5篇轻微修正,1篇严重过时(dissolve-transition-system-cazalis.md需重写),2篇存档补充,3篇补充说明
- dissolve-transition-system-cazalis.md 已更新为 V3 方案