# 参数类型不一致 (Expression Parameter Mismatch)

原文出处：[https://notes.sleightly.dev/parameter-mismatching/](https://notes.sleightly.dev/parameter-mismatching/)

<p class="callout info">**译者注释**：Bool 布尔 (True/False)</p>

<p class="callout info">**译者注释**：Int 整数/整形 (0, 1, 2, 3, 4, 5...)</p>

<p class="callout info">**译者注释**：Float 浮点/<span style="color: rgb(186, 55, 42);">小数</span> (0.13, 0.45, 0.255...)</p>

<p class="callout info">**译者注释**：`动画器参数` 指的是 Animator 内的参数；`Expression 参数` 指的是 VRC Expression Parameter List 内的参数</p>

在一般的 VRChat Avatars 3.0 创作过程中，VRChat Expression Parameters 的参数类型应该设置为与 Animator 内相同的类型（`Bool`、`Int`、`Float`）。

然而，Expression Parameters 和 Animator 参数之间的参数类型在不一致的情况下也仍能正常工作。这种行为因参数类型的不同而有所差异，具体如下所述。

[![image.png](https://docs.vrcd.org.cn/uploads/images/gallery/2024-09/scaled-1680-/mdqoKOXbO36OgJ1n-image.png)](https://docs.vrcd.org.cn/uploads/images/gallery/2024-09/mdqoKOXbO36OgJ1n-image.png)

一个标记为 `Toggle` 的参数被添加到 VRChat Expression Parameters 中，类型为 `Bool`

[![image.png](https://docs.vrcd.org.cn/uploads/images/gallery/2024-09/scaled-1680-/0S9xDvYLrbtXEmvs-image.png)](https://docs.vrcd.org.cn/uploads/images/gallery/2024-09/0S9xDvYLrbtXEmvs-image.png)

一个标记为 `Toggle` 的参数被添加到 local Animator 参数中，类型为 `Float`

## 已知互相兼容的参数类型及其行为

### Expression Parameter Bool

<table border="1" id="bkmrk-%E5%8A%A8%E7%94%BB%E5%99%A8%E5%8F%82%E6%95%B0-%E2%86%92-expression-%E5%8F%82" style="border-collapse: collapse;"><colgroup><col style="width: 33.3598%;"></col><col style="width: 33.3598%;"></col><col style="width: 33.3598%;"></col></colgroup><thead><tr><td>*动画器参数 → Expression 参数*</td><td>*Expression Bool = False*</td><td>*Expression Bool = True*</td></tr></thead><tbody><tr><td>Bool → Bool</td><td>Bool = False</td><td>Bool = True</td></tr><tr><td>Bool → Int</td><td>Int = 0</td><td>Int = 1</td></tr><tr><td>Bool → Float</td><td>Float = 0.0</td><td>Float = 1.0</td></tr></tbody></table>

### Expression Parameter Int

<table border="1" id="bkmrk-%E5%8A%A8%E7%94%BB%E5%99%A8%E5%8F%82%E6%95%B0-%E2%86%92-expression-%E5%8F%82-1" style="border-collapse: collapse;"><colgroup><col style="width: 50.0571%;"></col><col style="width: 50.0571%;"></col></colgroup><thead><tr><td>*动画器参数 → Expression 参数*</td><td>行为</td></tr></thead><tbody><tr><td>Int → Bool</td><td>任何大于 <span class="hljs-number">0</span> 的 <span class="hljs-type">Int</span> 值将使 bool 为 <span class="hljs-literal">True</span></td></tr><tr><td>Int → Int</td><td>预期行为</td></tr><tr><td>Int → Float</td><td>直接转换：例如 <span class="hljs-type">Int</span> <span class="hljs-operator">=</span> <span class="hljs-number">2</span> → <span class="hljs-type">Float</span> <span class="hljs-operator">=</span> <span class="hljs-number">2.0</span></td></tr></tbody></table>

###   


### Expression Parameter Float

<table border="1" id="bkmrk-%E5%8A%A8%E7%94%BB%E5%99%A8%E5%8F%82%E6%95%B0-%E2%86%92-expression-%E5%8F%82-2" style="border-collapse: collapse;"><colgroup><col style="width: 50%;"></col><col style="width: 50%;"></col></colgroup><thead><tr><td>*动画器参数 → Expression 参数*</td><td>行为</td></tr></thead><tbody><tr><td>Float → Bool</td><td>任何大于 <span class="hljs-number">0</span> 的 <span class="hljs-type">Float</span> 值将使 bool 为 <span class="hljs-literal">True</span></td></tr><tr><td>Float → Int</td><td>四舍五入转换：≥<span class="hljs-number">0.5</span> → <span class="hljs-number">1</span> ; <span class="hljs-operator">&lt;</span><span class="hljs-number">0.5</span> → <span class="hljs-number">0</span></td></tr><tr><td>Float → Float</td><td>预期行为</td></tr></tbody></table>

## 为什么 Avatar 参数类型之间互相兼容？

Unity Animators 在 C# 后端使用浮点数处理参数，而 VRChat 则使用 SBytes 代替 bool、int 或 float。

Animator 和 VRCSDK 通过允许你从界面中选择参数类型来优化用户体验。

如果这样来看的话，参数并不是被转换，而是**不一致**。

这种不一致的兼容性同样适用于 VRChat 的[内置参数](https://creators.vrchat.com/avatars/animator-parameters/#parameters)。

目前，AV3 Emulator 和 GestureManager 已经实现了模拟参数类型兼容的功能。