title: 穿脱开关架构 created: 2026-05-09 updated: 2026-05-09 type: reference tags: [vrchat, avatar, toggle, animator, parameter]
穿脱开关架构
用 Bool/Int 参数 + Animator 状态机 + Dissolve 动画实现服装穿脱
核心组件
1. VRC Avatar Parameter Driver
作用:将 VRC Int 参数值映射到 Animator Bool
使用场景: - 菜单 Button 按下 → 触发 Int 参数变化 - Int 参数变化 → Driver 设对应 Bool - 所有 Animator 层共享同一组 Bool
2. Animator Bool 参数
| 参数名 | 类型 | 用途 |
|---|---|---|
Bra |
Bool | 内衣开关 |
Shorts |
Bool | 内裤开关 |
AllOff |
Bool | 整套穿透 |
3. Animation Clip
控制材质属性实现 Dissolve:
- _DissolveProgress (Poiyomi/liltoon)
- alpha (Standard Shader)
切换系统类型
参考:ImLeXz/2-for-2-Toggle-System-VRC-Avatars-3.0-
Individual Toggle(独立开关)
特点:可以同时开启多个
Group Toggle(组切换)
特点:同组只有一个可激活
示例:套装A / 套装B / 套装C 互斥
菜单结构:
- 套装A (Toggle) → Outfit = 0
- 套装B (Toggle) → Outfit = 1
- 套装C (Toggle) → Outfit = 2
On To Off Toggle(默认ON)
特点:默认显示,点击消失
参数设计
方案A:独立 Bool(简单)
优点:简单直观 缺点:参数数量有限(VRChat Avatar 3.0 有参数上限) alse=消失 Shorts (Bool) // true=显示, false=消失
**优点**:简单直观
**缺点**:参数数量有限(VRChat Avatar 3.0 有参数上限)### 方案B:Int 节省参数(推荐)
```csharp
// OutfitMode: 套装模式
// 0 = 全套装(Bra=true, Shorts=true)
// 1 = 仅内衣(Bra=true, Shorts=false)
// 2 = 全裸/穿透(Bra=false, Shorts=false)
// 或细分:
ClothingTop (Int) // 0=外衣, 1=内衣, 2=不穿
ClothingBottom (Int) // 0=外裤, 1=内裤, 2=不穿
状态机设计
内衣穿脱
Layer: FX
State Machine: Underwear_Dissolve
┌─────────────┐ Bra=true ┌─────────────┐
│ Bra_ON │ ←─────────→ │ Bra_OFF │
│ dissolve=0 │ │ dissolve=1 │
└─────────────┘ Bra=false └─────────────┘
转换配置
// Bra_ON → Bra_OFF
transition.hasExitTime = false;
transition.addCondition(AnimatorConditionType.If, "Bra", false);
// Bra_OFF → Bra_ON
transition.hasExitTime = false;
transition.addCondition(AnimatorConditionType.If, "Bra", true);
Animator Layer 分工
Action Layer
- 同步逻辑(定时同步参数给晚加入的玩家)
- VRC Avatar Parameter Driver
- 不在镜子里运行
FX Layer
- 实际 Dissolve 动画
- 会在镜子里显示
- 在这里放 Dissolve 动画
同步机制
问题:Animator 参数不网络同步
现象:晚加入的玩家看不到别人的切换状态
解决:2-for-2-Toggle-System 方案
同步系统:
1. 定时(默认10秒)触发 VRC Avatar Parameter Driver
2. Driver 读取当前 Bool 状态
3. 写入对应 Int 参数到网络
4. 其他客户端收到同步