跳转至

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(独立开关)

特点:可以同时开启多个

示例:内衣 + 饰品A + 饰品B 可以同时开启

动画:
  - Bra_ON → 设置 Bra = true
  - Bra_OFF → 设置 Bra = false

Group Toggle(组切换)

特点:同组只有一个可激活

示例:套装A / 套装B / 套装C 互斥

菜单结构:
  - 套装A (Toggle) → Outfit = 0
  - 套装B (Toggle) → Outfit = 1
  - 套装C (Toggle) → Outfit = 2

On To Off Toggle(默认ON)

特点:默认显示,点击消失

示例:内衣默认是穿的

逻辑:
  - 默认状态:Bra = true (显示)
  - 点击后:Bra = false (消失)

参数设计

方案A:独立 Bool(简单)

Bra (Bool)      // true=显示, false=消失
Shorts (Bool)   // true=显示, false=消失

优点:简单直观 缺点:参数数量有限(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. 其他客户端收到同步

完整流程

用户点击菜单 "内衣"
Expression Menu 发送 Bra = true
Animator 检测到 Bra 条件变化
Transition: Bra_OFF → Bra_ON
播放 Bra_ON Animation Clip
_DissolveProgress: 1.0 → 0.0
内衣逐渐显示(溶解出现)
FF → Bra_ON ↓ 播放 Bra_ON Animation Clip ↓ _DissolveProgress: 1.0 → 0.0 ↓ 内衣逐渐显示(溶解出现) ```## 相关资源