title: VRChat/Unity 综合特性验证 (第二波) created: 2026-05-06 status: VERIFIED sources: - "https://raw.githubusercontent.com/lilxyzw/lilToon/master/Assets/lilToon/Shader/lts.shader" - "https://raw.githubusercontent.com/lilxyzw/lilToon/master/Assets/lilToon/Shader/Includes/lil_common_input.hlsl" - "https://raw.githubusercontent.com/bdunderscore/modular-avatar/main/docs%7E/docs/reference/parameters.md" - "https://docs.unity3d.com/Manual/class-BlendTree.html" - "https://docs.unity3d.com/ScriptReference/Animator.SetLayerWeight.html"
VRChat/Unity 综合特性验证报告 (第二波)
验证时间: 2026-05-06
验证重点: lilToon 高级特性、Unity 动画系统、MA Parameters 机制
1. lilToon 关键特性属性验证 (源码级)
1.1 Outline (描边) 属性
来源: lts.shader + lil_common_input.hlsl
| 属性名 | 类型 | 作用 | 关键参数 |
|---|---|---|---|
_OutlineColor |
Color | 描边颜色 (HDR) | 默认 (0.6, 0.56, 0.73) |
_OutlineTex |
2D | 描边纹理 | 支持 UV 动画 |
_OutlineWidth |
Range(0,1) | 描边宽度 | 默认 0.08 |
_OutlineWidthMask |
2D | 描边遮罩 | 控制局部粗细 |
_OutlineFixWidth |
Range(0,1) | 固定描边宽度 | 0=跟随模型缩放, 1=固定像素宽度 |
_OutlineVertexR2Width |
Enum | 顶点红通道控制宽度 | 0=关, 1=开 |
_OutlineDeleteMesh |
Toggle | 删除背向面 | 优化内表面不可见时的性能 |
_OutlineDisableInVR |
Toggle | VR 中禁用描边 | 解决 VR 视角穿模问题 |
避坑:
* 内表面描边: 如果模型有内表面 (如口腔),描边会出现在内部导致视觉异常。可使用 _OutlineDeleteMesh 或 Mask 修复。
* VR 视角: VR 中相机在头部内部,描边可能导致头部模型被遮挡,建议开启 _OutlineDisableInVR。
_OutlineDeleteMesh 或 Mask 修复。
* VR 视角: VR 中相机在头部内部,描边可能导致头部模型被遮挡,建议开启 _OutlineDisableInVR。### 1.2 Emission (自发光) 属性
来源: lil_common_input.hlsl
| 属性名 | 类型 | 作用 | 关键参数 |
|---|---|---|---|
_EmissionColor |
Color (HDR) | 发光颜色 | |
_EmissionMap |
2D | 发光纹理 | 支持 UV 动画 |
_EmissionBlink |
Vector | 闪烁设置 (频率/相位) | (0, 0, 3.141593, 0) |
_EmissionBlend |
Range(0,1) | 混合强度 | |
_EmissionBlendMode |
Enum | 混合模式 | 0=Add, 1=Mul, 2=Screen 等 |
_EmissionGradTex |
2D | 渐变纹理 | 随时间变化的流光效果 |
_EmissionParallaxDepth |
Float | 视差深度 | 配合 UV 模式使用 |
_EmissionFluorescence |
Range(0,1) | 荧光效果 | 模拟荧光棒/霓虹灯 |
高级用法:
* 闪烁: _EmissionBlink 控制闪烁频率。z 分量通常为 PI (3.14159) 作为基础频率。
* 流光: 使用 _EmissionGradTex 和 _EmissionGradSpeed 实现流光效果 (如发光武器、能量槽)。
* 两层发光: 支持 _Emission2ndColor 等第二层发光属性,可叠加不同纹理。
1.3 Rim (边缘光) & MatCap (材质捕获)
来源: lil_common_input.hlsl
| 特性 | 关键属性 | 作用 |
|---|---|---|
| RimShade | _RimShadeColor, _RimShadeMask |
边缘阴影 (增加立体感) |
| RimLight | _RimColor, _RimBorder, _RimBlur |
边缘高光 (金属感/轮廓光) |
| MatCap | _MatCapTex, _MatCapColor, _MatCapBlend |
材质捕获 (反射环境/金属质感) |
| MatCap 2nd | _MatCap2ndTex, _MatCap2ndBlend |
第二层 MatCap (叠加细节) |
注意事项:
* VR 视差: _RimVRParallaxStrength 和 _MatCapVRParallaxStrength 控制在 VR 中是否跟随视线移动。设为 0 可固定反射方向。
* 法线影响: _RimNormalStrength 和 _MatCapNormalStrength 控制法线贴图对边缘光/MatCap 的影响程度。
。设为 0 可固定反射方向。
* 法线影响: _RimNormalStrength 和 _MatCapNormalStrength 控制法线贴图对边缘光/MatCap 的影响程度。### 1.4 Backlight (背光)
来源: lts.shader
| 属性名 | 作用 |
|---|---|
_BacklightColor |
背光颜色 |
_BacklightBorder |
背光边界 |
_BacklightBlur |
背光模糊 |
_BacklightDirectivity |
方向性 (模拟逆光) |
_BacklightViewStrength |
视角强度 |
1.5 IDMask (ID 遮罩)
来源: lts.shader + lil_common_functions.hlsl
原理: 利用顶点 ID (Vertex ID) 在 Shader 中判断顶点属于哪个区域 (0-7),从而在不拆分网格的情况下实现局部材质控制。
| 属性名 | 作用 |
|---|---|
_IDMaskCompile |
编译开关 (必须为 1 才能启用) |
_IDMaskFrom |
ID 来源 (UV0-UV7 或 VertexColor) |
_IDMask1 - _IDMask8 |
8 个 ID 区域的开关 |
_IDMaskIndex1 - _IDMaskIndex8 |
每个 ID 区域对应的索引值 |
应用场景: * 局部溶解 (只溶解衣服不溶解身体) * 局部换色 (只改变某一部分颜色) * 局部透明 (不需要拆分 Mesh)
2. Unity 动画系统补充验证
2.1 Animation Blend Trees (混合树)
来源: Unity Manual (class-BlendTree.html)
核心概念:
* 用途: 在两个或多个相似动画之间平滑混合 (如走路 -> 跑步)。
* 类型:
* 1D: 单个参数控制混合 (最常用,如 Speed 控制走/跑)
* 2D Freeform Cartesian: 两个参数独立控制 (如 Speed 和 Direction)
* 2D Simple Directional: 两个参数表示方向 (如 8 方向移动)
* Motion Field: 混合树的每个节点是一个动画片段 (Motion)。
* Threshold: 每个运动对应的阈值参数值。
VRChat 中的应用: * 呼吸/站立混合: 根据玩家是否静止混合呼吸动画。 * 手势过渡: 在 Finger 动画之间平滑过渡。 *: 每个运动对应的阈值参数值。
VRChat 中的应用:
* 呼吸/站立混合: 根据玩家是否静止混合呼吸动画。
* 手势过渡: 在 Finger 动画之间平滑过渡。### 2.2 Animator Layer Weight (层权重)
来源: Unity API (Animator.SetLayerWeight)
API:
VRChat 中的关键层: | 层名 | 默认权重 | 作用 | |:---|:---:|:---| | Base Layer | 1.0 | 基础动作 (站立/行走) | | Additive Layer | 1.0 | 叠加动作 (呼吸/晃动) | | Gesture Layer | 1.0 | 手势 (手指/手形) | | Action Layer | 1.0 | 全身动作 (舞蹈/坐姿) | | FX Layer | 1.0 | 特效/功能 (溶解/换色/物理) |
注意事项:
* FX 层通常设为 1.0,以确保特效完全生效。
* 如果要临时禁用某个层,可以将权重设为 0.0。
3. MA Parameters 组件深层机制
来源: MA 官方文档 (parameters.md)
3.1 参数类型详解
| 类型 | 是否占用参数槽位 | 用途 |
|---|---|---|
| Bool/Int/Float | ✅ 是 | 常规 Animator 参数 |
| Animator Only | ❌ 否 | 仅 Animator 内部使用 (如 MergeAnimator 中间状态) |
| Prefix | ❌ 否 | PhysBone 前缀 (用于重命名 PhysBone 参数) |
3.2 参数重命名 (Renaming)
- Change name to: 将参数重命名为新名称 (对 MA Parameters 外部生效)。
- Auto rename: 自动选择一个未被占用的名称,避免冲突。
- 嵌套重命名:
- 内部 MA Parameters 将
foo重命名为bar。 - 外部 MA Parameters 将
bar设置为auto rename。 - 最终结果:内部组件依然使用
bar,外部自动分配新名。
3.3 Saved/Synced 控制
- Saved: 跨 Avatar 切换和 VRChat 重启后保存参数值。
- Synced: 在网络中同步参数值 (其他人能看到你的状态)。
- Synced = False: 不占用网络同步带宽,仅本地生效 (适合本地特效)。
3.4 默认值 (Default Values)
- 如果留空:使用主 Expressions Parameters 中的值,或零/false。
- Override Animator Defaults: 强制覆盖 Animator Controller 中的默认值。
- 如果选中
Animator Only并设置了默认值,此选项会被忽略,Animator 默认值始终被替换。 lts**: 强制覆盖 Animator Controller 中的默认值。 - 如果选中
Animator Only并设置了默认值,此选项会被忽略,Animator 默认值始终被替换。## 4. 验证结论总结
| 特性 | 验证状态 | 关键发现 |
|---|---|---|
| lilToon Outline | ✅ | 支持 VR 禁用、顶点宽度控制、内表面删除 |
| lilToon Emission | ✅ | 支持两层发光、闪烁、流光渐变、荧光 |
| lilToon Rim/MatCap | ✅ | 支持 VR 视差修正、法线影响控制 |
| lilToon IDMask | ✅ | 利用 Vertex ID 实现局部材质控制,无需拆分网格 |
| Unity Blend Trees | ✅ | 1D/2D 混合树支持平滑动画过渡 |
| Animator Layer Weight | ✅ | SetLayerWeight(0-1) 控制层影响力 |
| MA Parameters | ✅ | 支持 Animator Only (不占槽位)、嵌套重命名 |