diff --git a/README.md b/README.md index 4a93008..44eadb0 100644 --- a/README.md +++ b/README.md @@ -58,7 +58,7 @@ ### 目前的覆盖范围 -- [VRChat 文档枢纽 - The VRChat Documentation Hub](https://docs.vrchat.com/) +- [VRChat 帮助文档 - The VRChat Documentation Hub](https://docs.vrchat.com/) - [VRChat 创作者文档 - VRChat Creators Docs](https://creator.vrchat.com/) - [ClientSim 文档](https://clientsim.docs.vrchat.com/) - [UdonSharp 文档](https://udonsharp.docs.vrchat.com/) diff --git a/docs/.vitepress/config/index.ts b/docs/.vitepress/config/index.ts index 2ffcaba..f57100a 100644 --- a/docs/.vitepress/config/index.ts +++ b/docs/.vitepress/config/index.ts @@ -359,7 +359,7 @@ export default withPwa( ], shortcuts: [ { - name: "VRChat 文档枢纽", + name: "VRChat 帮助文档", url: "/docs.vrchat.com/", description: "您可以找到全面的指南和文档,帮助您尽快开始玩 VRChat,如果遇到困难,还可以获得支持。", diff --git a/docs/.vitepress/config/sidebars.ts b/docs/.vitepress/config/sidebars.ts index ae6b368..b2f008c 100644 --- a/docs/.vitepress/config/sidebars.ts +++ b/docs/.vitepress/config/sidebars.ts @@ -171,7 +171,7 @@ export function vrchatCreatorsDocsSidebar(): DefaultTheme.SidebarItem[] { text: '虚拟形象', link: '/creators.vrchat.com/avatars/', collapsed: true, items: [ - { text: 'Creating Your First Avatar', link: '/creators.vrchat.com/avatars/creating-your-first-avatar' }, + { text: '创建您的第一个虚拟形象', link: '/creators.vrchat.com/avatars/creating-your-first-avatar' }, { text: 'Avatar Dynamics', link: '/creators.vrchat.com/avatars/avatar-dynamics/', collapsed: true, @@ -182,11 +182,12 @@ export function vrchatCreatorsDocsSidebar(): DefaultTheme.SidebarItem[] { ], }, { text: 'Impostors', link: '/creators.vrchat.com/avatars/avatar-impostors' }, - { text: 'Animator Parameters', link: '/creators.vrchat.com/avatars/animator-parameters' }, + { text: '动画器参数', link: '/creators.vrchat.com/avatars/animator-parameters' }, { text: 'Avatar Optimization Tips', link: '/creators.vrchat.com/avatars/avatar-optimizing-tips' }, { text: 'Performance Ranks', link: '/creators.vrchat.com/avatars/avatar-performance-ranking-system' }, { text: 'Avatar Scaling', link: '/creators.vrchat.com/avatars/avatar-scaling' }, - { text: 'Technical Considerations around Avatar Scaling', link: '/creators.vrchat.com/avatars/expression-menu-and-controls' }, + { text: 'Technical Considerations around Avatar Scaling', link: '/creators.vrchat.com/avatars/avatar-scaling.md' }, + { text: '模型菜单与控件', link:'/creators.vrchat.com/avatars/expression-menu-and-controls'}, { text: 'Playable Layers', link: '/creators.vrchat.com/avatars/playable-layers' }, { text: 'Rig Requirements', link: '/creators.vrchat.com/avatars/rig-requirements' }, { text: 'Shader Blocking and Fallback System', link: '/creators.vrchat.com/avatars/shader-fallback-system' }, diff --git a/docs/creators.vrchat.com/avatars/animator-parameters.md b/docs/creators.vrchat.com/avatars/animator-parameters.md index b870a50..1aa6d06 100644 --- a/docs/creators.vrchat.com/avatars/animator-parameters.md +++ b/docs/creators.vrchat.com/avatars/animator-parameters.md @@ -1,186 +1,203 @@ ---- -title: "Animator Parameters" ---- +# 模型动画参数(Animator Parameters) -# Animator Parameters +::: warning 阅读本篇文章需要特定的前置知识 -::: warning Unity Knowledge Required - -This document is written with the assumption that you know a bit about [Unity Animators](https://docs.unity3d.com/2019.4/Documentation/Manual/class-AnimatorController.html). +您需要先了解 [Unity 动画控制器](https://docs.unity3d.com/cn/2019.4/Manual/class-AnimatorController.html) ,这样能帮助您更好的了解本文。 ::: -This is a list of Parameters (**case-sensitive**) that can be added to any Playable Layer (animation controller) and change across all Playable Layers that include this parameter. User created parameters that are not in this list will exist only locally within that animation controller and are not currently changeable by the avatar. - -You'll need to add these to your Playable Layer animators to use them. **They are case-sensitive!** +**模型动画参数**是一个用于 VRChat 模型可播放层动画器的参数列表,参数名称**区分大小写**。 -::: danger Don't Dead-End! -You should assume that parameter values may change. If you "dead-end" your animators-- as in, you don't have an "exit" in any particular branch-- you may end up having a broken avatar. +::: info **模型动画参数**包含**预设参数**与**玩家参数** +**预设参数**,也就是 VRChat 已经预置好的参数,可以被添加到任意可播放层中(FX,Action等),当这些参数的值因 VRChat 内部机制发生变动时,对应的新值就会同步给包含它们的可播放层动画控制器。
+**玩家参数**,也就是您自创的参数,其值不会被 VRChat 内部机制更改,根据您为它们安排的位置,其新值可能取决于: +- 您在模型菜单中的按钮操作 +- 模型可播放层中的[状态机行为](/creators.vrchat.com/avatars/state-behaviors)。 ::: -## 一般参数 - -| Name | Description | Type | Sync | -| ---------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | -------------- | -| IsLocal | True if the avatar is being worn locally, false otherwise | Bool | None | -| [Viseme](#viseme-values) | [Oculus viseme index](https://developer.oculus.com/documentation/unity/audio-ovrlipsync-viseme-reference) (`0-14`). When using Jawbone/Jawflap, range is `0-100` indicating volume | Int | Speech | -| Voice | Microphone volume (`0.0-1.0`) | Float | Speech | -| [GestureLeft](#gestureleft-and-gestureright-values) | Gesture from L hand control (0-7) | Int | IK | -| [GestureRight](#gestureleft-and-gestureright-values) | Gesture from R hand control (0-7) | Int | IK | -| GestureLeftWeight | Analog trigger L (0.0-1.0)† | Float | Playable | -| GestureRightWeight | Analog trigger R (0.0-1.0)† | Float | Playable | -| AngularY | Angular velocity on the Y axis | Float | IK | -| VelocityX | Lateral move speed in m/s | Float | IK | -| VelocityY | Vertical move speed in m/s | Float | IK | -| VelocityZ | Forward move speed in m/s | Float | IK | -| VelocityMagnitude | Total magnitude of velocity | Float | IK | -| Upright | How "upright" you are. 0 is prone, 1 is standing straight up | Float | IK | -| Grounded | True if player touching ground | Bool | IK | -| Seated | True if player in station | Bool | IK | -| AFK | Is player unavailable (HMD proximity sensor / End key) | Bool | IK | -| Expression1 - Expression16 | User defined param, Int (`0`-`255`) or Float (`-1.0`-`1.0`) | Int / Float | IK or Playable | -| [TrackingType](#trackingtype-parameter) | See description below | Int | Playable | -| VRMode | Returns `1` if the user is in VR, `0` if they are not | Int | IK | -| MuteSelf | Returns `true` if the user has muted themselves, `false` if unmuted | Bool | Playable | -| InStation | Returns `true` if the user is in a station, `false` if not | Bool | IK | -| Earmuffs | Returns `true` if the user's Earmuff feature is on, `false` if not | Bool | Playable | -| IsOnFriendsList | Returns `true` if the user viewing the avatar is friends with the user wearing it. `false` locally. | Bool | Other | - -"Supine" and "GroundProximity" are visible in the Debug display, but are not implemented yet. They currently do nothing and never change values. - -† GestureLeftWeight and GestureRightWeight go from 0.0 to 1.0 in various gestures depending on the trigger pull. For example, if you make a fist but don't pull the trigger on the left hand, GestureLeft will be 1, but GestureLeftWeight will be 0.0. When you start pulling the trigger, it will climb from 0.0 towards 1.0. This can be used to create "analog" gestures or conditionally detect various things. +您需要将这些参数添加到可播放层动画控制器中才能使用它们。**注意,这些参数名称区分大小写!** -## Avatar Scaling Parameters +::: danger 不要让您的动画器卡死!! +您应该假设参数值可能会发生变化。如果您的动画控制器“卡死”——也就是说,您没有为某个特定状态添加一个出口,或者下一个过渡状态——那么您的模型就可能会出问题。 +::: -| Name | Description | Type | Sync | -| ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----- | -------- | -| ScaleModified | Returns `true` if the user is scaled using avatar scaling, `false` if the avatar is at its default size. | Bool | Playable | -| ScaleFactor | Relation between the avatar's default height and the current height. An avatar with a default eye-height of 1m scaled to 2m will report `2`. | Float | Playable | -| ScaleFactorInverse | Inverse relation (`1/x`) between the avatar's default height and the current height. An avatar with a default eye-height of 1m scaled to 2m will report `0.5`. Might be inaccurate at extremes. | Float | Playable | -| EyeHeightAsMeters | The avatar's eye height in meters. | Float | Playable | -| EyeHeightAsPercent | Relation of the avatar's eye height in meters relative to the default scaling limits (`0.2`-`5.0`). An avatar scaled to 2m will report `(2.0 - 0.2) / (5.0 - 0.2)` = `0.375`. | Float | Playable | -All of these parameters are read-only. +## 模型动画参数列表 + + +| 名称 | 描述 | 数值类型 | 同步类型 | 参数类型 | +| -- | -- | -- | -- | -- | +| VelocityX | 横向移动速度(米/秒) | Float | IK | 预设 | +| VelocityY | 纵向移动速度(米/秒) | Float | IK | 预设 | +| VelocityZ | 前向移动速度(米/秒) | Float | IK | 预设 | +| AngularY | Y 轴(垂直于地面的轴)上的角速度 | Float | IK | 预设 | +| Grounded | 如果模型的脚部接触到地面,则为 `True`,反之则为`false` | Bool | IK | 预设 | +| AFK | 如果玩家暂时不在游戏中(当头显未检测到人体或您已按下 End 键时),则为 `True` | Bool | IK | 预设 | +| Upright | 您的身体直立程度。0 表示卧倒,1 表示完全直立于地面 | Float | IK | 预设 | +| [TrackingType](#trackingtype-parameter) | 请参阅下文描述 | Int | Playable | 预设 | +| VRMode | 如果玩家处于 VR 模式中,则为 `1`;反之则为 `0` | Int | IK | 预设 | +| MuteSelf | 如果玩家关闭了自己的语音开关,则为 `true`;反之则为 `false` | Bool | Playable | 预设 | +| Voice | 当前麦克风音量(`0.0-1.0`)| Float | Speech | 预设 | +| Earmuffs | 如果玩家已打开耳罩功能,则为 `true`;反之则为 `false` | Bool | Playable | 预设 | +| VelocityMagnitude | 模型当前总移动速度(矢量)的大小 | Float | IK | 预设 | +| ScaleFactor | 当前模型高度与默认高度之间的比例。例如当默认视角球高度为 1 米的模型缩放到 2 米时,将表现为`2` | Float | Playable | 预设 | +| ScaleFactorInverse | 当前模型高度与默认高度之间的倒数比例(`1/x`)。例如当默认视角球高度为 1 米的模型缩放到 2 米时,这个参数的值为 `0.5`。该参数值在极端情况下可能不准确。 | Float | Playable | 预设 | +| ScaleModified | 如果玩家缩放了当前模型,则为 `true`;反之,则为 `false` | Bool | Playable | 预设 | +| EyeHeightAsPercent | 模型的视角球高度与默认缩放限制(`0.2`-`5.0`)之间的关系。例如当模型缩放为 2 米,那么这个参数的值是 `(2.0 - 0.2) / (5.0 - 0.2)` = `0.375` | Float | Playable | 预设 | +| EyeHeightAsMeters | 当前模型的视角球高度(以米为单位)。 | Float | Playable | 预设 | +| IsOnFriendsList | 如果查看模型的玩家与使用模型的玩家互为好友,则为 `true`。如果是其他情况,则向模型为 `false` | Bool | 其他 | 预设 | +| [Viseme](#viseme-参数值解释列表) | 表示口型,大小范围为`0-14`。当模型的 Viseme 模式使用 Jawbone/Jawflap 时,则表示您的当前麦克风音量,大小范围为 `0-100`。 | Int | Speech | 预设 | +| [GestureLeft](#gestureLeft-和-gestureRight-参数值解释列表) | 左手当前手势,范围为 `0-7`| Int | IK | 预设 | +| [GestureRight](#gestureLeft-和-gestureRight-参数值解释列表) | 右手当前手势,范围为 `0-7`| Int | IK | 预设 | +| GestureLeftWeight | 左手手柄的扳机按压幅度,0.0 表示不按下扳机,1.0 表示完全按下扳机 | Float | Playable | 预设 | +| GestureRightWeight | 右手手柄的扳机按压幅度,0.0 表示不按下扳机,1.0 表示完全按下扳机 | Float | Playable | 预设 | +| Seated | 如果模型已就座(姿态处于 Seated 状态),则为 `True` | Bool | IK | 预设 | +| InStation | 如果玩家在 VRCStation 中,则为 `True`;如果不在 VRCStation 中,则为 `false` | Bool | IK | 预设 | +| IsLocal | 如果该模型是由本地玩家(您自己)使用的,则为 `True`;否则为 False | Bool | 无同步 | 预设 | +| [AvatarVersion](/creators.vrchat.com/worlds/components/vrc_station#sdk3-station-with-sdk2sdk3-avatar) | 如果该模型上传时,SDK 版本在 2020.3.2 后,则为 `3`,反之则为 `0` | Int | IK | 预设 | +| 任意名称 | 玩家自定义模型参数(Expression Parameters) | Bool,Int 或 Float | IK 或 Playable | 玩家 | + +::: info 关于部分参数的附加说明 +† `GestureLeftWeight` 和 `GestureRightWeight` 的值会根据扳机的按压力度从 0.0 变化到 1.0。 + +举例来说,如果您使用左手握住了手柄,但大拇指不按压扳机,`GestureLeft` 的值将为 1,但 `GestureLeftWeight` 的值将为 0.0。当您开始按压扳机时,`GestureLeftWeight` 的值将从 0.0 逐渐增加到 1.0。您可以使用这种特性来条件性的检测某些东西。 +::: +预设参数只能被读取,无法被玩家手动写入。 -## Parameter Types +## 参数类型(Parameter Types) -You have access to three types of variable when defining your parameters in your Parameters object. +在定义参数时,您可以使用三种类型的变量。 -You can use up to a total of 256 bits of "memory". This isn't strictly memory in the sense of memory usage of the avatar, but has to do with the bandwidth you use when syncing parameters. +定义参数。在这里所指的“内存限制”为同步参数时使用的带宽限制,而不是模型的内存使用限制。 -| Parameter Type | Range | Memory Usage | Notes | -| :------------- | :---------------- | :----------- | :--------------------------------- | -| `int` | `0`-`255` | 8 bits | Unsigned 8-bit int. | -| `float` | `-1.0` to `1.0` | 8 bits | Signed 8-bit fixed-point decimal†. | -| `bool` | `True` or `False` | 1 bit | | + -† Remotely synced `float` values have 255 possible values, giving a precision of `1/127` over the network, and can store `-1.0`, `0.0`, and `1.0` precisely. When updated locally, such as with [OSC](/docs.vrchat.com/docs/osc-overview), float values are stored as native (32-bit) floating-point values in animators. +| 参数类型 | 范围 | 内存使用 | 备注 | +| :-- | :-- | :-- | :-- | +| `int` | `0`-`255` | 8 位 | 无符号 8 位整数。 | +| `float` | `-1.0` 到 `1.0` | 8 位 | 有符号 8 位定点小数。 | +| `bool` | `True`(1) 或 `False`(0) | 1 位 | 1 位逻辑数 | -## GestureLeft and GestureRight Values +† 由远程同步来的 `float` 值有 255 个可能的值,其跨网络精度值为 `1/127`,可以精确存储 `-1.0`、`0.0` 和 `1.0`。当在本地更新时,例如使用 [OSC](https://docs.vrchat.com/docs/osc-overview),浮点值以原生(32 位)浮点值存储在动画控制器中。 -GestureLeft and GestureRight use these as their values: + -| Index | Gesture | -| ----- | ----------- | -| 0 | Neutral | -| 1 | Fist | -| 2 | HandOpen | -| 3 | FingerPoint | -| 4 | Victory | -| 5 | RockNRoll | -| 6 | HandGun | -| 7 | ThumbsUp | +## `GestureLeft` 和 `GestureRight` 参数值解释列表 -## Viseme Values +它们的值及这些值对应的手势名称如下: -We use the [Oculus viseme index](https://developer.oculus.com/documentation/unity/audio-ovrlipsync-viseme-reference), top to bottom, where `sil` is 0. For reference: +| 参数值 | 手势名称 | +| ---- | ----------- | +| 0 | Neutral | +| 1 | Fist | +| 2 | HandOpen | +| 3 | FingerPoint | +| 4 | Victory | +| 5 | RockNRoll | +| 6 | HandGun | +| 7 | ThumbsUp | -| Viseme Parameter | Viseme | -| :--------------- | :----- | -| 0 | `sil` | -| 1 | `pp` | -| 2 | `ff` | -| 3 | `th` | -| 4 | `dd` | -| 5 | `kk` | -| 6 | `ch` | -| 7 | `ss` | -| 8 | `nn` | -| 9 | `rr` | -| 10 | `aa` | -| 11 | `e` | -| 12 | `i` | -| 13 | `o` | -| 14 | `u` | + + + + + -## Sync Types +::: info 译者注释 +您可以在[这里](/docs.vrchat.com/OVERVIEW/controls/controls.md)了解这些手势及它们在不同平台上的触发方法: +::: -- **Speech** - Only used for visemes, is driven by the Oculus Lipsync output parameters depending on your speech. Updated locally, not directly synced (because its driven by audio) -- **Playable** - A slower sync mode meant to synchronize longer-running animation states. Updates every 0.1 to 1 seconds as needed based on parameter changes (1 to 10 updates per second), but you shouldn't rely on it for fast sync. -- **IK** - A faster sync mode meant to synchronize frequently-changing values. Updates continuously every 0.1 seconds (10 updates per second), and interpolates `float` values locally for remote users. Depending on the parameter, this may also just be calculated based on the avatar's locally rendered IK state. +## `Viseme` 参数值解释列表 + +该参数的值遵照 [Oculus 口型标准](https://developer.oculus.com/documentation/unity/audio-ovrlipsync-viseme-reference),以下供参考: -When an Expression Parameter is in-use in a Puppet menu, it automatically swaps from Playable to IK sync so you get the continuous update rate and smooth interpolation. When the menu is closed, it returns to Playable sync. +| Viseme 参数 | Viseme | +| :---------- | :----- | +| 0 | `sil` | +| 1 | `pp` | +| 2 | `ff` | +| 3 | `th` | +| 4 | `dd` | +| 5 | `kk` | +| 6 | `ch` | +| 7 | `ss` | +| 8 | `nn` | +| 9 | `rr` | +| 10 | `aa` | +| 11 | `e` | +| 12 | `i` | +| 13 | `o` | +| 14 | `u` | -## Driving Expression Parameters +## 同步模式 -In addition, Expression parameters can be "driven" to a value via State Behaviors. They can be set using the `Avatar Parameter Driver` State Behavior on a state in an animator. +- **Speech** - 仅用于 `Viseme`,该参数由您的语音驱动,使用 Oculus Lipsync 标准输出值。参数值在本地更新,不直接同步给其他玩家(当您的音频同步到其他人后,它就会驱动参数,并在他们的本地完成更新值)。 +- **Playable** - 一种比 **Speech** 更慢的同步模式,适用于不频繁变动的参数。它会根据具体情况,每 0.1 到 1 秒更新一次值(也就是每秒 1 到 10 次更新)。不建议您依赖它进行快速同步。 +- **IK** - 一种比 **Speech** 更快的同步模式,适用于频繁变动的参数。每 0.1 秒更新一次。它会根据具体情况,将一部分的值在远端玩家的本地插值为 `float` ,一部分的值会仅基于模型的本地渲染 IK 状态来计算。 -## AFK State + -The AFK state is triggered by: +当您在 Puppet 菜单中使用模型参数时,它会自动从 Playable 同步切换到 IK 同步,以保证快速的更新速率和平滑的插值。关闭操控轮盘后,数值将切换回 Playable 同步模式。 -- The user removing the headset and the HMD proximity sensor returning that the headset is not being worn -- A system menu is open. This depends on how the platform you're using delivers data when system menus are up-- for example, the Oculus Dash doesn't register as AFK, but SteamVR's menu **does** register as AFK. This is kind of a knock-on, and not a designed behavior. -- The user has pressed the End key, toggling the AFK state. +## 驱动模型参数 -## TrackingType Parameter +此外,在动画控制器中,可以通过状态行为中`Avatar Parameter Driver` 将模型参数固定到某个值,或进行一些其他的设置参数操作。 -`TrackingType` indicates a few pieces of information. +## AFK 状态 -If the value is 3, 4, or 6 while `VRMode` is 1, the value is indicating how many tracked points the wearer of the avatar has enabled and currently tracked. **This value can change!** If a user in 6-point tracking removes their extra three points of tracking, they will go from a value of 6 to a value of 3. Take this into account when you design your animator. +AFK 状态由以下情况触发: -If the value is 0, 1, or 2 while `VRMode` is 1, the value indicates that the avatar is still initializing. You should not design animators to branch based off this combination of values, and it should instead wait for a "valid" value of 3, 4, or 6. +- (VR) 玩家摘下头显,头显传感器未检测到用户 +- (VR) 打开 VR 系统菜单。这取决于您使用的具体头显平台 -- 例如,打开 Oculus Dash 菜单不会被判定为 AFK,但打开 SteamVR 菜单会被判定为 AFK。这个效果并非预期设计,而是一种间接的结果。 +- 玩家按下 End 键,切换 AFK 状态。 -::: warning Account for changes +## `TrackingType` 参数值解释列表 -During avatar initialization, this value may change! Ensure that your animator accounts for possible changes, and that it doesn't "dead-end" into any branch. +| 参数 | 描述 | +| -- | :-- | +| 0 | 模型未初始化,该值一般仅在玩家切换模型且其 IK 数据尚未被发送时出现。 | +| 1 | 模型骨架类型为通用骨骼,该值一般在玩家启用了某种追踪(例如头显或追踪器),但由于模型骨架类型被设置为通用骨骼,导致追踪被关闭时出现。如果同时 `VRMode` 的值为 0,则表明玩家是桌面用户,而不是 VR 用户。 | +| 2 |
*该值会出现在 AV2 模型,但也可能在您使用 SDK3 station 时出现。您原则上不应在模型的 AV3 控制器上将它用于长时间状态的过渡参数。* 仅手部追踪,没有手指追踪,该值只会在过渡状态中临时出现—— `TrackingType` 可能马上会变化到另一个值,并不会恒为该值。| +| 3 | 头部和手部追踪,如果 `VRMode` 为 `1`,则玩家处于 3 点追踪的 VR 端中。如果 `VRMode` 为 `0`,则玩家处于桌面电脑端中。 | +| 4 | 4 点追踪 VR 用户,头部、手部和腰部追踪。 | +| 6 | 全身追踪 VR 用户,头部、手部、腰部和脚部追踪。 | -::: +因此,当 `VRMode` 为 1 时,请注意对 `TrackingType` 的值的使用: +- 如其值为 3,4 或 6,则代表当前玩家佩戴的 VR 追踪设备数量。当设备数量发生变化,这个值也会发生变化,在设计动画控制器时您需要考虑到这一点。 +- 如其值为 0,1 或 2,则代表模型仍在初始化。请勿使用这些值来组合设计动画控制器,而是使用 3,4 或 6 等有效值来设计。 -| Parameter | Description | -| --------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 0 | Uninitialized. Usually only occurs when the user is switching avatars and their IK isn't sending yet. | -| 1 | Generic rig. The user might have tracking of any kind on, but the avatar is rigged as Generic,so tracking is ignored. _Might_ be a desktop user if `VRMode` is 0. | -| 2 | _Only occurs with AV2,and therefore isn't a state you should expect to be in for very long for AV3 controllers on avatars. May still occur with SDK3 stations._
Hands-only tracking with no fingers. This will only occur in states that are transitions-- as in, you should expect `TrackingType` to change again, and the avatar should not stay in this state. | -| 3 | Head and hands tracking. If `VRMode` is `1`, this user is in 3-point VR. If `VRMode` is `0`, this is a Desktop user in a humanoid avatar. | -| 4 | 4-point VR user. Head, hands, and hip. | -| 6 | Full Body Tracking VR user. Head, hands, hip, and feet tracked. | +## Expression 参数名称 +如果您在 `Expression Parameter` 文件中新建参数,请**务必**重命名这些新参数。因为新建的参数名会继承列表中最后一个已有参数的名字。 + -## Expression Parameter Aliasing +您可根据自己的标准,来命名这些新参数。命名好后,您可直接在动画器中使用这个参数。此外,菜单中按钮名称与动画器中的参数名称不必一一对应。只要它们使用的 Expression 参数名称相同即可。因此您可以随意修改您的菜单按钮名字,而不必担心按钮名字和 Expression 参数冲突。 -You **must** create names (or "aliases") for Expression parameters. **You cannot (and shouldn't!) use the default Expression name for the parameters. ** + -Once you have created names for any Expression parameter you want to use, you can use that name directly in your Controller. This means can come up with your own standard naming for your parameters. This _also_ means that Menu definitions and Controllers can be mixed and matched as long as they use the same names. You can get prefab controllers from others and create your own menu styles based on your preferences, without worrying about Expression parameter conflicts. +在命名自己的参数时,您可加入斜杠符号(`/`)来归类它。
例如:将参数命名为 `Toggles/Hat` ,那么在动画器的过渡(Transitions)和 Expression 菜单中,选择该参数时将显示为: Toggles -(光标停留时展开下拉菜单)-> Hat,选择完毕后,参数的名字是`Toggles/Hat`。这种命名方式不会改变参数的工作方式,但是会使得管理大型参数列表更加方便。 -When naming your own parameters, using forward slashes (`/`) will cause parameters to automatically organize in various selection dropdowns. For example, naming a parameter `Toggles/Hat` will make the menu selection show up as Toggles -> Hat when selecting parameters for things like Animator transitions and Expression Menus, while keeping the underlying parameter the same name. This doesn't change how parameters behave, it just makes it easier to work with large parameter lists. + -## Default AV3 Aliasing +## VRChat 动画器默认参数 -There's a few "defaults" in use by the template AV3 VRChat controllers that you can use if you don't want to build out your own controllers. These won't collide with your own use (as long as you don't name them the same thing) thanks to aliasing. + -In particular, the Default Action and FX layers use aliasing. You don't need to worry about using a Expression that is in these layers. +VRChat Avatar(模型)模板动画器中预留了一些默认参数。如果您打算使用这些模板动画器,那么其中的预留参数不会与您自创的参数产生冲突,只要它们的名字不雷同。 -Actions use aliased parameters named `VRCEmote` , which is an Int with a range of 1 to 16. +作为例子,Action 和 FX 层的模板动画器就包含了一些默认参数。您不需要担心怎么配置这些层里的模型功能。 -FX uses aliased Float parameters called `VRCFaceBlendH` (-1,1) and `VRCFaceBlendV` (-1,1), if you want to try out your own menus to use them. The default FX layer requires that you have a skinned mesh named `Body` with `mood_happy` , `mood_sad` , `mood_surprised` , and `mood_angry` blendshapes. +其中,Action 使用的默认参数名为 `VRCEmote`,是一个范围为 1 到 16 的整数。
+而 FX 使用的默认浮点参数名为 `VRCFaceBlendH`(-1,1)和 `VRCFaceBlendV`(-1,1),如果您打算使用这些模板动画器,那么您可在模型菜单中使用这些参数。 +此外,默认的 FX 层动画器的表情动画要求您有一个名为 `Body` 的蒙皮网格,其中包含 `mood_happy`、`mood_sad`、`mood_surprised` 和 `mood_angry` 等形态键。 -To restate, if you have an avatar that you upload as an Avatar3 avatar without any custom Playable layers, you'll be able to use some built-in emotes with them as long as you've got the above-named blendshapes. +再次强调,如果您将一个模型上传为虚拟形象,而 ta 没有自定义的可播放层,那么只要您的模型拥有上述形态键,您就可以使用动画器的预制表情。 + -If you also have an `eyes_closed` blendshape, it'll close them when you use the default Die emote or go AFK. +如果还有一个名为 `eyes_closed` 的形态键,当您使用默认的 Die 表情或进入 AFK 状态时,这个形态键会使得您的模型闭眼。 -## Cross-Platform Parameter Sync +## 跨平台参数同步 -When using an avatar that has both Quest and PC versions uploaded, parameters are synced by their position in the parameters list and their parameter type, **not** by the names of the parameters. For a given parameter to sync between PC and Quest, it has to be in the same position in the parameter list, and have the same parameter type. +当您使用的模型同时有 PC 和 Quest 版时,那么对于这两个版本,参数**不是**通过参数的名称,而是通过它们在参数列表中的位置和参数类型进行同步的。要使给定参数在 PC 和 Quest 之间同步,它必须在参数列表中的相同位置,并且具有相同的参数类型。 -Given this, it can be a good idea to use the same Expression Parameters asset for both the PC and Quest versions of an avatar, even if one version doesn't make use of all the parameters. +鉴于这一点,建议在 PC 和 Quest 版本的模型中使用相同的 Expression Parameters 资源,即使其中某个版本不会使用所有参数。 \ No newline at end of file diff --git a/docs/creators.vrchat.com/avatars/avatar-dynamics/physbones.md b/docs/creators.vrchat.com/avatars/avatar-dynamics/physbones.md index 273d644..20cfbb6 100644 --- a/docs/creators.vrchat.com/avatars/avatar-dynamics/physbones.md +++ b/docs/creators.vrchat.com/avatars/avatar-dynamics/physbones.md @@ -8,55 +8,54 @@ title: "Physbones" 在技术迭代关系上,Physbones 是 Dynamic Bones 的替代品。虽然两者存在着很多共同点,但 Physbones 提供了一些完全不同的参数,因此不是所有的 Dynamic Bones 组件都可以直接自动转换为 VRChat 的 Physbone. -在SDK的`VRCSDK\Examples3\Dynamics\Robot Avatar`目录下可以找到使用 Avatar Dynamics 的示例。 +在SDK的`VRCSDK/Examples3/Dynamics/Robot Avatar`目录下可以找到使用 Avatar Dynamics 的示例。 -# VRCPhysbone +## VRCPhysbone 它定义了一个通过 Physbones 的功能实现动画的骨骼链。这些骨骼链可以用于模拟例如头发、尾巴、耳朵等身体部位跟随躯干运动的效果。VRCPhysbone 提供了一些选项参数供您对其效果进行精细化调整。 -此外,Physbones 还可以与您和其他人发生交互!如果您给予其他用户权限,那么其他人可以抓住您模型上设置的 Physbones ,并可以在抓住 Physbone 时按下扳机键来锁定它的位置。您也可以在配置选项中禁用此功能,例如不允许锁定、不允许抓取或不允许碰撞。 +此外,Physbones 能与玩家发生交互。如果您给予其他玩家权限,那么其他人可以抓住您模型上的 Physbones ,同时按下扳机键来锁定它的位置。您也可以在组件的配置选项中禁用此功能,例如不允许锁定、不允许抓取或不允许碰撞。 虽然 Physbones 没有专门为布料效果而优化,但它也可以作为布料组件的下位替代品,直到我们实现自己的布料组件为止。 ![](/creators.vrchat.com/images/avatars/physbones-ca9ee06-2022-05-04_18-23-09_Unity.png) -## 版本选择 +### 版本选择 -您现在可以直接在组件上选择要使用的 VRCPhysbone 组件的版本。当您创建新组件时,将默认选择最新版本。现有的模型将继续使用旧版本 VRCPhysbone ,除非您手动更新它们并重新上传。 +您现在可以直接在组件中,选择要使用的 VRCPhysbone 组件的版本。当您创建新组件时,将默认选择最新版本。现有的模型将继续使用旧版本 VRCPhysbone ,除非您手动更新它们并重新上传模型。 版本1.0: -- VRCPhysbone 组件的初始版本。 +- VRCPhysbone 组件的最初版本。 版本1.1: + - 弹性骨骼更新,允许骨骼被挤压、拉伸。 - 重力现在表现为影响骨骼在静止时旋转的程度系数。骨骼向重力方向移动需要一个正的拉力。 - 刚度现在表现为影响骨骼停留在其先前方向的程度系数。 ## Transform -`Root Transform` - 组件开始的变换。如果此处留空,则我们假设组件起点在此游戏对象上。 -`Ignore Transforms` - 不受此组件影响的变换列表。这个列表也会自动包括列表内变换的所有子级变换。 -`Endpoint Position` - 用于在链的每个末端点创建额外骨骼的向量。仅在值非零时使用。通常,您会希望沿着 +Y 增加此值,+Y 方向是由根部指向骨骼的末端。 +`Root Transform` - 骨骼链的起点变换。如果此处留空,则默认为拥有该组件的游戏对象。 +`Ignore Transforms` - 不受此组件影响的变换列表。除被列入的变换外,这些变换的所有子级变换也不会受此组件影响。 +`Endpoint Position` - 用于在骨骼链的各个终点添加额外骨骼的向量,值非零时生效。通常,您会希望沿着 +Y 增加此值,即沿着起点指向骨骼终点的方向。 `Multi-Child Type` - 当定义了多个骨骼链时,根骨骼的运动模式。这包括三种模式: + 如果设置为 **Ignore** ,根骨骼将不会出现物理效果。这对于头发等物体非常有用,因为您可以只在根骨骼上设置一个 Physbone 组件即可作用于所有子级头发骨骼! 如果设置为 **First** ,根骨骼将与层级中的第一个骨骼连接形成一个连续的链。其他所有链仍然有效,但它们将从每个相应链的第一个骨骼开始,而不是从根骨骼开始。 - ::: info - 第一个骨骼指的是具有 VRCPhysbone 组件的根骨骼下的各个子级骨骼,它们就是根骨骼下不同骨骼链的第一个骨骼 + ::: info 第一个骨骼指的是什么? + 第一个骨骼指的是具有 VRCPhysbone 组件的根骨骼下的各个子级骨骼,它们就是根骨骼下不同骨骼链的起点。 ::: - 如果设置为 **Average** ,根骨骼的运动将是所有其他链的平均值。这意味着每个链的基部都可以运动。 + 如果设置为 **Average** ,则 VRCPhysbone 会以根骨骼为起点,生成一个不一定与子级骨骼重合的虚拟骨骼链,这个虚拟链的位置与大小取根骨骼下的各骨骼变换平均值,其摆动时,会带动根骨骼下的各骨骼摆动。 - ::: info - 如果选择这个选项,VRCPhysbone 会以根骨骼为起点,生成一个不一定与子级骨骼重合的虚拟骨骼链,这个骨骼链的位置与大小受根骨骼下的各骨骼变换平均值影响,当这个骨骼链摆动时,会带动其他参与这个变换平均值的骨骼摆动。 - ::: ::: danger -如果您要放置 VRCPhysbone 组件的目标骨骼是单个根骨骼,或着单个根骨骼及其多个子级(但没有孙级),则您 **必须** 定义一个末端点位置! +如果您要放置 VRCPhysbone 组件的目标骨骼是单个根骨骼,或着单个根骨骼及其多个子级(但没有孙级),则您 **必须** 定义一个非零的`Endpoint Position`! 例如,如果您将 Physbone 组件放在下面的任何一个 `根骨骼` 上,那么为了使 Physbones 正常工作,您**必须**定义一个 **Endpoint Position** 。这与 Dynamic Bones 不同! @@ -75,171 +74,177 @@ title: "Physbones" 您还可以通过在每个`子骨骼`之后添加“末端骨骼”来解决此问题,但这涉及对骨架的编辑工作。 ::: -## Forces (受力) +### Forces (受力) -**Integration Type** 定义了用于模拟受此组件影响的任何变换运动的数学类型。根据您选择的类型,受力部分的可用选项将发生变化。您可以在以下两种类型之间选择: +**Integration Type** 定义了用于模拟骨骼变换运动受外界影响的受力表现类型。根据您选择的类型,该部分的可用选项将发生变化。您可以在以下两种类型之间选择: - `Simplified` 是一种更稳定的方法,表现更慢,对外部冲击和外力反应不太敏感,但更容易配置。 - `Advanced` 不太稳定,并且对外部冲击和外力反应更敏感,但允许更复杂的配置。 - 在默认设置下,这两种模式的表现非常相似,但调整设置并进行测试将很快揭示它们之间的差异。 + 在默认设置下,这两种模式的表现非常相似,它们之间的差异可以通过细调设置和测试来体现。 ::: info -下面的大多数(不是全部)选项都可以通过在滑块旁边按下 C 按钮来使用曲线。曲线可以让您调整骨骼链的长度上的值,并允许在骨骼链内进行非常复杂的设置! +下面的大多数(不是全部)选项都可以通过在滑块旁边按下 C 按钮来使用曲线。曲线可以让您微调 Physbone 在链的不同长度上的受力属性,借此您可以让骨骼呈现出一些复杂的力学表现! -事实上,大多数 Physbones 设置都可以使用曲线!学会使用它们,您的 Physbones 将看起来很棒! +下方的大多数 Physbones 设置都可以使用曲线! ::: ![physbones-054e326-2022-04-19_11-32-12_Unity.png](/creators.vrchat.com/images/avatars/physbones-054e326-2022-04-19_11-32-12_Unity.png) `Pull` - 用于将骨骼恢复到其静止位置的力量大小。 -`Spring` - 当骨骼试图达到其静止位置时,骨骼发生摆动的程度。仅在简化的 Integration Type 中可用。 -`Momentum` - 当骨骼试图达到其静止位置时,骨骼发生摆动的程度。仅在高级的 Integration Type 中可用。尽管这里的描述与 Spring 相同,但其实际效果与后者略有不同。 -`Stiffness` - 骨骼试图保持在其静止位置的程度。仅在高级的 Integration Type 中可用。 +`Spring` - 当骨骼试图达到其静止位置时,骨骼发生摆动的程度。仅在`Simplified`类型中可用。 +`Momentum` - 当骨骼试图达到其静止位置时,骨骼发生摆动的程度。仅在`Advanced`类型中可用。其实际效果与`Spring`略有不同。 +`Stiffness` - 骨骼试图保持在其静止位置的程度。仅在`Advanced`类型中可用。 `Gravity` - 影响骨骼的重力大小。是正值则向下拉动骨骼,是负值则向上拉动骨骼。 -`Gravity Falloff` - 仅在 Gravity 值非零时可用。它控制骨骼在静止位置时忽略重力影响的程度。值为 1.0 则表示在静止位置时完全不受重力影响。这样,当骨骼从初始位置旋转时,重力可以影响骨骼的运动状态,而不会影响骨骼的静止状态。 +`Gravity Falloff` - 仅在`Gravity`值非零时可用。它控制骨骼在静止位置时忽略重力影响的程度。值为 1.0 则表示在静止位置时完全不受重力影响。这样,当骨骼由旋转离开初始位置时,重力可以影响骨骼的运动状态,而不会影响骨骼的静止状态。 -使用 Gravity Falloff 参数的一种方法是,如果您的头发已经被建模为在正常站立时的形状,您可以使用 1.0 的重力衰减。这样,当您只是站立不动时,您的头发不会受到重力影响,并保持在其原始建模位置。如果您的头发被建模为 45 度向外伸展,并且您希望它受到足够的重力影响以形成漂亮的曲线(但不完全向外伸展或完全向下伸展),那么您可以调整滑块,来使用 0.5-0.8 之间的值,这只在静止姿势时对头发施加一部分重力。 +使用`Gravity Falloff`参数的一种方法是,如果您的头发已经被建模为在正常站立时的静止状态,您可以将该参数设置为 1.0。这样,当您只是站立不动时,您的头发不会受到重力影响,并保持在其原始建模位置。如果您的头发被建模为 45 度向外伸展,并且您希望它受到足够的重力影响以形成漂亮的曲线(但不完全向外伸展或完全向下伸展),那么您可以调整滑块,来使用 0.5-0.8 之间的值,这样会在静止姿势时对头发施加一部分重力。 `Immobile Type`更改`Immobile`的工作模式。 如果设置为**All Motion**,`Immobile` 会减少从根变换的父级计算出的任何运动的程度。这是新的 Physbones 和转换后的 Dynamic Bones 的**默认模式**。在此模式下,`Immobile` 系数将抑制场景空间或播放空间中的所有 Physbone 运动。 如果设置为 **World (Experimental)** , `Immobile` 仅从场景根变换的参考位置减少位置运动。动画或 IK 引起的运动仍会正常影响骨骼。_此模式可能会在将来更改!_ - + 这意味着在播放空间中移动仍会正常影响 Physbones 的运动,但是这时`Immobile` 系数也会同样抑制 Physbones 的运动。 -## Limits (限制) +### Limits (限制) -设置 Limits (限制)可以限制 Physbone 链的移动量。这种办法在当您不希望头发进入头部时非常有用,并且比碰撞器要来的**高效得多**! +设置 Limits (限制)可以限制 Physbone 链的旋转程度。这种办法适用于阻止头发穿模进入头部,并比设置碰撞器**更加高效**! -此外,在配置限制选项时,当您选择 Physbone 链时,场景视图中将可视化显示这些限制。在微调限制时,这些显示将非常有帮助! +此外,在配置限制选项时,当您选择 Physbone 链上的物体时,场景视图中将可视化显示这些限制。在微调限制时,这些显示将非常有帮助! `Limit Type` 有多种模式。这些模式都允许在 `Pitch` 、`Yaw` 和 `Roll` 等方面对 `Rotation` 进行调整,或者分别沿 X、Y 和 Z 轴进行调整。 -### None +##### None `None` 表示此骨骼链上没有启用限制。这个模式没有配置选项。 -### Angle +#### Angle + +![Angle](/creators.vrchat.com/images/avatars/physbones-b7abe1f-2022-04-19_11-49-26_Unity.png) -`Angle` 表示骨骼链将以 `Rotation` 定义的轴为中心,限制在某个 `Max Angle` 上。在场景视图中,这被可视化为一个圆锥体。 +`Angle` 表示骨骼链将以 `Rotation` 定义的轴为中心,限制在 `Max Angle` 内。在场景视图中,这被可视化为一个圆锥体。 -### Hinge +#### Hinge - `Hinge` 表示骨骼链将仅在由 `Rotation` 定义的平面上,并被限制在某个 `Max Angle` 上。在场景视图中,这被可视化为一个圆片的切片,类似于比萨或馅饼。 +![Hinge](/creators.vrchat.com/images/avatars/physbones-b7723cc-2022-04-19_11-50-04_Unity.png) -### Polar + `Hinge` 表示骨骼链将仅在由 `Rotation` 定义的平面上,并被限制在 `Max Angle` 内。在场景视图中,这被可视化为一个圆片的切片,类似于披萨或馕。 -`Polar` 有点复杂。如果您将 `Hinge` 沿 `Yaw` 扫过一定角度,您将得到 `Polar` 坐标中的一个球段。您可以配置 `Max Pitch` 和 `Max Yaw` 来调整球段的大小,并使用 `Rotation` 来定义该段在球体上的位置。`Polar` 的可视化特别有帮助。 +#### Polar -不要过度使用 Polar 限制,因为它们会产生一定的性能成本。大量使用它(超过64个)可能会导致一些问题。如果您的 `Max Pitch` 和 `Max Yaw` 值相似或相同,则 `Angle` 限制就足够了,并且它在性能方面成本较低。 +![](/creators.vrchat.com/images/avatars/physbones-824db3c-2022-04-19_11-51-22_Unity.gif) -## 碰撞 +`Polar` 有点复杂。它就像用 `Hinge` 沿 `Yaw` 扫过一定角度得到的图形球段。您可以配置 `Max Pitch` 和 `Max Yaw` 来调整球段的大小,并使用 `Rotation` 来定义该段在球体上的位置。它的可视化可以帮助您更好的配置其选项。 -`Radius` - 骨骼周围的碰撞半径(以米为单位)。用于碰撞和抓取。 -`Allow Collision` - 允许骨骼与除此组件上指定的碰撞器以外的碰撞器发生碰撞。目前,唯一的其他碰撞器是每个玩家的手和手指,这些碰撞器由其模型定义。 -`Colliders` - 与这些骨骼发生碰撞的碰撞器列表。 +不要过度使用 `Polar` 限制,因为它们会产生一定的性能成本。大量使用它(超过64个)可能会导致一些问题。如果您的 `Max Pitch` 和 `Max Yaw` 值相似或相同,则考虑转用 `Angle` 限制,因为它在性能方面成本较低。 -## 伸缩和压缩 +### 碰撞 + +`Radius` - 骨骼的碰撞半径(以米为单位)。用于碰撞和抓取。 +`Allow Collision` - 允许骨骼与此组件上碰撞器列表以外的碰撞器发生碰撞。目前,这些碰撞器仅包括每个玩家的手和手指,它们的大小和位置由对应的模型定义。 +`Colliders` - 会与这些骨骼发生碰撞的碰撞器列表。 + +### 伸缩和压缩 `Stretch Motion` - 运动对骨骼的伸展/压缩的影响程度。值为零意味着骨骼只会因抓取或碰撞而伸展/压缩。 `Max Stretch` - 骨骼可以伸展的最大量。该值是原始骨骼长度的倍数。[注意:最大边界](#maximum-bounds) `Max Squish` - 骨骼可以压缩的最大量。该值是原始骨骼长度的倍数。 -## 抓取和定位 +### 抓取和定位 `Allow Grabbing` - 允许玩家抓取骨骼。 `Allow Posing` - 允许玩家在抓取后锁定骨骼。 -`Grab Movement` - 控制被抓取的骨骼的移动速度。值为零时,骨骼使用 `Pull` 和 `String` 来达到抓取位置。值为 1 时,骨骼 +`Grab Movement` - 控制被抓取的骨骼的移动速度。值为零时, `Pull` 和 `String` 将影响骨骼移动到抓取位置的速度。值为 1 时,骨骼 将立即移动到抓取位置。 -`Snap To Hand` - 当骨骼被抓取时,它是否将与抓取它的骨骼对齐。 +`Snap To Hand` - 当骨骼被抓取时,它是否要与抓取它的骨骼对齐。 -## 选项 +### 选项 -- `Parameter` - 用于为模型控制器提供多个参数的前缀。在下面的项目中,将参数设置为`Tail`将使用`Tail`替换`{parameter}`。 -- `{parameter}_IsGrabbed` - [Bool] 骨骼当前是否被抓取。 +- `Parameter` - 用于为模型控制器提供多个参数的前缀。如将该参数设置为`Tail`,则下文参数名中的`{parameter}`将被替换为`Tail`。 +- `{parameter}_IsGrabbed` - [Bool] 骨骼是否被抓取。 - `{parameter}_IsPosed` - [Bool] 骨骼是否被锁定。 -- `{parameter}_Angle` - [Float] 0.0-1.0 范围。从其原始静止位置到末端骨骼的 180 度角度的归一化值。换句话说,如果您完全扭曲一个骨骼,使其与起始方向相反,那么此参数的值将为 1.0。 -- `{parameter}_Stretch` - [Float] 0.0-1.0 范围。骨骼离其最大伸展长度的距离程度。 -- `Is Animated` - 允许对骨骼变换进行动画处理。每帧骨骼静止位置将根据动画进行更新。必须启用此选项,以使 Physbone 链中的任何骨骼(包括根骨骼!)遵守应用于它的动画。 -- `Reset When Disabled` - 当此组件被禁用时,骨骼将自动重置到其默认位置。 +- `{parameter}_Angle` - [Float] 值范围为 0.0-1.0。从其原始静止位置到末端骨骼的 180 度角度的归一化值。换句话说,如果您完全扭曲一个骨骼,使其与起始方向相反,那么此参数的值将为 1.0。 +- `{parameter}_Stretch` - [Float] 值范围为 0.0-1.0。骨骼被拉伸到其最大伸展长度的百分比量。 +- `Is Animated` - 允许对骨骼变换进行动画处理。每帧骨骼静止位置将根据动画进行更新。如果您想让 Physbone 链中的任何骨骼(包括根骨骼!)的位置能被动画更新,则必须启用此选项。 +- `Reset When Disabled` - 如果启用该选项,则当此组件被禁用时,骨骼将自动重置到其默认位置。 -## 重要说明、使用技巧等 +### 重要说明、使用技巧等 **不要在同一个游戏对象上同时放置约束和 Physbone 组件**,因为这会导致执行顺序问题。 -将约束放在父游戏对象上。您仍然可以将约束的目标设置为原始游戏对象。 +您仍然可以将约束放在父游戏对象上,并把将约束的目标设置为原含有 Physbone 组件的游戏对象。 ::: warning Quest限制 -** Physbones 在 Meta Quest 上有严格的限制。**这是为了防止 Meta Quest 设备的性能降低,这些设备的 CPU 资源通常已经很低。 - +** Physbones 在 Meta Quest (一体机 VR)上有严格的限制。**这是为了防止这些设备遇到性能问题,因为通常这些设备的 CPU 处理能力受限。 + 您可以将这些限制视为 Quest 的 Very Poor 的限制,详细信息请参阅[最低显示性能等级](/creators.vrchat.com/avatars/avatar-performance-ranking-system#quest-limits)文档。 ::: -### 每个组件的限制 +#### 每个组件的限制 **单个 Physbone 组件不能同时影响超过 256 个变换。**这包括根骨骼以及其所有子级。_这也会影响 Dynamic Bone 的转换!_ -但是,您应该在最初就尽量避免有太多的变换。尝试将链中的骨骼向上合并到其直接父级。社区创建的工具(如Cat's Blender插件)可以为您完成此操作。 +您应该在一开始就尽量避免有太多的骨骼。尝试将链中的骨骼向上合并到其直接父级。社区创建的工具(如Cat's Blender插件)可以为您完成此操作。 -### 动画属性 +#### 动画属性 - Physbone 的属性,如 Spring、Pull、Stiffness 等,在初始化时就会被设置,**无法被动画处理**。 + Physbone 的受力属性,如 Spring、Pull、Stiffness 等,在模型初始化时就会被设置,**之后无法被动画处理**。 -但是,如果您对 Physbone 组件的属性进行动画处理,然后将组件的动画处理为关闭再打开,您可能会得到所需的目的。请注意,这不是对这些属性进行动画处理的受支持方法,我们也会在将来的更改中不再支持这个办法。(换句话说,它可能会出错。如果出错,我们不会尝试修复它。) +但是,如果您设置动画为:关闭 Physbone 组件,对组件的属性进行动画处理,然后再打开组件,那么您可能可以完成对受力属性的动画化更改。请注意,我们不会官方支持和维护这一种对属性进行动画处理的方法。(换句话说,它可能会失效。如果失效,我们不会尝试修复它。) -### 人体骨骼 +#### 人体骨骼 **不要将人体躯干的骨骼设置为 Physbone 的根骨骼。**换句话说,不要将 Hip、Spine、Chest、Upper Chest、Neck、Head 或任何肢体骨骼设置为根骨骼。这将导致严重问题。 相反,复制要用作根骨骼的骨骼,并将要动画的所有子骨骼重新连接到新的复制根骨骼。这应该在 Blender 中完成。社区制作的工具(如 Cat's Blender 插件)可以为您完成此操作。 -### Physbone 旋转 +#### Physbone 旋转 -与 Dynamic Bones 不同,** Physbone 链的根骨骼允许旋转**。但是它不能平移。这可能会对某些设置产生一些影响-请自行尝试以了解其表现。 +与 Dynamic Bones 不同,** Physbone 链的根骨骼可以旋转**。但是它不能平移。这可能会对某些设置产生一些影响-请自行尝试以了解其表现。 -### Physbone AV3参数 +#### Physbone AV3参数 -在影响参数时,**无需使用由 `VRCExpressionParameters` 对象定义的同步参数**。这些参数已在本地和远程机器上更新,因为两者都将运行 Physbones。 +您**无需出于需要同步的目的,在 `VRCExpressionParameters` 对象中定义 Physbone 的参数**,因为这些参数会自动在本地和远端机器间同步。 -### Physbone `Immobile` 行为 +#### Physbone `Immobile` 行为 Dynamic Bones 的 `Inert` 值基于组件的放置位置,而不是根变换。这可能是 Dynamic Bones 的一个错误。因此, Physbones 的 `Immobile` 值基于根变换。这可能会影响某些情况下的行为。 -### 最佳组件使用 +#### 最佳组件使用 -由于 Physbones 的多线程特性,将所有骨骼放入单个链中并不总是最高效的。多个组件使我们能够在线程之间分解工作。但是,您仍然应该努力减少组件的数量...但是与 Dynamic Bones 相比,拥有几个组件并不会像以前那样糟糕。 +由于 Physbones 的多线程特性,不推荐将所有骨骼定义到同一个链中,因为这不会那么高效。多个组件使我们能够在线程之间分解工作。尽管如此,您仍然应该努力减少组件的数量...但是与 Dynamic Bones 相比,模型上拥有多个组件不会带来大量的性能代价。 -如果您*真的*需要一个良好帧数,当您的单个组件影响超过 128 个变换时,您应考虑将链集拆分。如果您有一个包含 256 个骨骼的裙子,并且它们在根处分里为骨骼链,那么将其分割为两个或三个组件将起到优化作用。 +如果您*真的*需要提高帧数,那么当您的单个组件影响超过 128 个骨骼时,您应考虑拆分它,例如如果您有一个包含 256 个骨骼的裙子,并且它们从根出发,分为数条骨骼链,那么将其分割为两个或三个组件将起到优化作用。 -但是,如果您只处理大约 32 个骨骼的情况...不要担心。正如您可能已经注意到的,这些都不是严格的规则!当某些东西看起来应该以不同的方式设置时,我们可能会在某些情况下引入一些软警告。 +但是,如果单个组件只影响大约 32 个骨骼时...不用担心。正如您可能已经注意到的,这些都不是严格的限制!当它们看起来能被以更好的方式设置时,我们会提出一些软警告。 -### 最大边界 +#### 最大边界 -每个 VRCPhysbone 组件都有一个边界框,随着骨骼的移动而增长和收缩。这些边界框有助于检测触摸和抓取 Physbones 的玩家的碰撞。为了效率起见,边界框被强制为最大为 10×10×10 米。 Physbones 可以超出此范围并继续正常工作。但是玩家可能由于其遥远位置,无法触摸或抓取这些骨骼。 +每个 VRCPhysbone 组件都有一个边界框,随着骨骼的移动而增长和收缩。这些边界框有助于检测触摸和抓取 Physbones 的玩家的碰撞。为了效率起见,边界框被强制为最大为 10×10×10 米。 Physbones 可以超出此范围并继续正常工作。但是玩家可能由于超出边界框范围,而无法触摸或抓取这些骨骼。 边界框仅考虑具有碰撞和半径大于零的骨骼。在需要提供非常长的伸展的情况下,只要在伸展点之后存在具有碰撞的骨骼,您就可以避免达到此最大边界限制。 + +## VRCPhysboneCollider -# VRCPhysboneCollider - -定义了一个会影响正确配置的 Physbones 的碰撞器。 +定义了一个会影响 Physbones 的碰撞器(前提是对应的 Physbone 有正确地配置了碰撞选项)。 ![](/creators.vrchat.com/images/avatars/physbones-ac38f46-2022-05-04_18-35-11_Unity.png) -- `Root Transform` - 放置此碰撞器的变换。如果为空,我们使用此游戏对象的变换。 +- `Root Transform` - 放置此碰撞器的变换。如果为空,则默认为含有该组件的游戏对象。 - `Shape Type` - 此碰撞器使用的碰撞形状类型。您可以选择球体、胶囊体或平面碰撞器。 - `Radius` - 从其原点延伸的碰撞器的大小。 - `Height` - 沿 Y 轴的胶囊体高度。 - `Position` - 相对于根变换的位置偏移量。 - `Rotation` - 相对于根变换的旋转偏移量。 -- `Inside Bounds` - 启用时,此碰撞器将包含其边界内的骨骼,而不是将其排除在外。 +- `Inside Bounds` - 启用时,此碰撞器将会把骨骼吸附在其形状内,而不是把骨骼排斥在其形状外。 - `Bones As Sphere` - 启用时,此碰撞器将 Physbone 碰撞半径视为以骨骼位置为中心的球体,而不是沿骨骼长度的胶囊体。 -## 标准碰撞器 +### 标准碰撞器 在 Avatar Descriptor 中定义了一组“标准碰撞器”,这些碰撞器位于一个名为 “Colliders” 的新部分中。此部分允许您定义一些存在于每个模型上的标准碰撞器。如果您不进行任何更改,则将自动设置这些碰撞器,但也可以进行微调以完全适应您的模型。这些碰撞器不会影响性能评级。 @@ -253,19 +258,19 @@ title: "Physbones" - Ring - Little -这些碰撞器主要作为 [Contact](/creators.vrchat.com/avatars/avatar-dynamics/contacts) 发送器,其他人可以用其模型检测到。但是,手指和手部碰撞器也用于创建全局的 [Physbone](physbones) 碰撞器,可以用于影响其他人的 Physbones。 +这些碰撞器主要作为 [Contact](/creators.vrchat.com/avatars/avatar-dynamics/contacts) 发送器,其他人可以用其模型检测到。但同时,手指和手部碰撞器也用于创建全局的 [Physbone](physbones) 碰撞器,它们可以与其他人的 Physbones 发生互动。 -## 自动 Dynamic Bone 转换 +### 自动 Dynamic Bone 转换 -默认情况下,客户端将自动将 Dynamic Bones 转换为 Physbones。这样做是为了提高整体性能,并且这对于模型之间的交互也是必要的。如果需要,您可以在主菜单的性能选项部分关闭此选项,但您将失去性能的提高和其他人与您交互的能力。 +默认情况下,客户端将自动将 Dynamic Bones 转换为 Physbones。这样做是为了提高整体性能,并且这对于模型之间的交互也是必要的。如果需要,您可以在主菜单的性能选项部分关闭此选项,但您会失去对应的性能提升和模型交互能力。 -默认情况下,Dynamic Bone 转换使用 Advanced 模式,因为我们能够更精确地将 DB 行为与 Advanced 集成方法匹配。此外,DB 转换使用 Ignore 作为 Multi-Child 类型。这可能会导致某些特殊的 DB 设置出现问题,但在转换过程中使用 First 或 Average 也会导致几乎所有情况下的不良行为。 +默认情况下,Dynamic Bone 转换后使用 Advanced 模式,因为我们能够更精确地将 DB 配置与使用 Advanced 模式的 Physbone 配置匹配。此外,DB 转换使用 Ignore 作为 Multi-Child 类型(因为使用 First 或 Average 类型会使得几乎所有情况下的 Physbone 出现问题。)。这可能会导致某些特殊的 DB 设置出现问题。 关闭转换意味着您将无法与由 Dynamic Bones 驱动的模型骨骼进行任何交互。但是,原生使用 Physbones 和 Contacts 的模型将不受影响。 -**重要说明: Dynamic Bones 和 Physbones 并不相同。**程序中的转换过程并不完美,我们打算随着时间的推移对其进行更多更新。但请记住:转换过程永远不会完美!自动转换的目标是使大多数设置工作得相当好,而不是完全的复制粘贴。_预计所有用户都将逐渐过渡到使用 Physbones ,以确保其模型的准确渲染和未来兼容性。_ +**重要说明: Dynamic Bones 和 Physbones 并不相同。**自动转换过程并不完美,我们打算随着时间的推移对其实施更多更新。但请记住:不会存在完美的自动转换!自动转换旨在大多数设置工作表现正常,而不是完全还原 Dynamic Bones 中的表现。_我们预计所有创作者都将逐渐过渡到使用 Physbones ,以确保其模型的准确渲染和未来兼容性。_ -## 手动 Dynamic Bone 转换 +### 手动 Dynamic Bone 转换 您可以选择使用 SDK 将模型从 Dynamic Bones 转换为 Physbones。 @@ -273,13 +278,13 @@ title: "Physbones" 您可以通过查看 Build Control Panel 或在 Unity 菜单中访问 `VRChat SDK/Utilities/Convert DynamicBones to Physbones` 来访问此工具。在此之前,您必须先选择一个模型。 -## 未迁移的 Dynamic Bone 组件 +### 未迁移的 Dynamic Bone 组件 Dynamic Bones 中的某些功能和行为在 Physbones 中不存在,因此不会迁移。 -`Force` - Dynamic Bone中 X 或 Z 方向的 `Gravity` 和 `Force` 值在 Physbones 中被忽略,因为在 Physbones 中没有相应的值。 +`Force` - Dynamic Bone中 X 或 Z 方向的 `Gravity` 和 `Force` 值不会被转换与迁移,因为在 Physbones 中没有相应的值。 -## Dynamic Bone 最终将被弃用 +### Dynamic Bone 最终将被弃用 Dynamic Bones 最终将从 VRChat 中完全删除。到那时,所有旧模型的 Dynamic Bones 将被自动转换。 diff --git a/docs/creators.vrchat.com/avatars/avatar-optimizing-tips.md b/docs/creators.vrchat.com/avatars/avatar-optimizing-tips.md index 943eb4a..4685906 100644 --- a/docs/creators.vrchat.com/avatars/avatar-optimizing-tips.md +++ b/docs/creators.vrchat.com/avatars/avatar-optimizing-tips.md @@ -1,128 +1,134 @@ ---- -title: "Avatar Optimization Tips" ---- - -# Avatar Optimization Tips - +# 模型优化技巧 + ::: warning -**This guide is not meant to be the end-all, be-all of avatar optimization!** Optimizing your avatar properly requires pretty wide knowledge of a ton of things. We don't expect everyone to know everything. +本指南并不全面涵盖关于模型优化的全部内容!正确优化模型需要掌握广泛的,来自很多方面的知识。我们不指望每个人都了解这些全部的知识。 -However, we try our best to keep this document updated with the most common things people miss, and the most important targets to hit. +当然,我们会尽力在这份文档中更新最常被忽视的优化事项和最重要的优化目标。 -If you have input on optimization tips, please use the **Suggest Edits** button in the top right and add your own! +如果您有更多关于优化技巧的建议,请点击屏幕右侧的*查看原文*,并使用原官方页面的左下角的*编辑此页*按钮添加您自己的办法! + + ::: -Do you want your avatar to be efficient and be loved by everyone because of all the frames you're saving them? Follow these tips and you should be good! - -Any recommended numbers or limits in this document are subject to change at any time. Although some of the descriptions provided below are not precise in a technical manner, this document is intended to assist novice users in learning how to optimize their avatars. +您想要您的模型性能高效,并因为提高了帧数而受大家喜欢吗?遵循以下技巧,您就可以做到这一点! -Community-created tools like [Cats Blender Plugin](https://github.com/michaeldegroot/cats-blender-plugin) (MIT license) allow users to very easily optimize their models and assist with common VRChat avatar problems. We strongly recommend using tools like this! It makes your job easier, and improves performance for all. +本文档中的任何推荐数值或限制都可能随时更改。尽管下面提供的某些描述在技术上不够准确,但本文档旨在帮助新手玩家学习如何优化他们的模型。 -As a sidenote, the SDK's Build Control panel provides numbers of components on avatars to help with optimization. +像 [Cats Blender 插件](https://github.com/michaeldegroot/cats-blender-plugin)(MIT 许可证)这样的社区工具可以帮助玩家非常轻松地优化他们的模型,并帮助解决常见的 VRChat 模型问题。我们强烈推荐使用这样的工具!它可以让您的工作更轻松,并提高模型的性能表现。 -## Do not use Dynamic Bones! -Dynamic Bones is a Unity Asset that you can purchase that allows you to define bones on your avatar's rig to move around as if they were hanging. You can also define static forces like gravity which can make hair fall more realistically. +附注:SDK 的构建控制面板(Build panel)提供了有关模型组件数量的统计信息,以帮助进行优化。 -Dynamic Bones is deprecated and will be removed eventually. Use [PhysBones](/creators.vrchat.com/avatars/avatar-dynamics/physbones) instead. +## 避免使用 Dynamic Bones! +Dynamic Bones (动态骨骼)是一种可购置的 Unity 资产,允许您在模型中定义可摆动的骨骼。您还可以对此赋予一些静态受力,如重力,以使头发下垂地更加逼真。 -VRChat will automatically convert Dynamic Bones to PhysBones at runtime. +Dynamic Bones 已被弃用,并会在将来被移除。请替用为 [PhysBones(物理骨骼)](/creators.vrchat.com/avatars/avatar-dynamics/physbones)。 -## Limit usage of Cloth -Cloth is a default Unity component that has a similar cost to Dynamic Bones and is more difficult to set up. Limit your use of Cloth heavily, and do not apply it to meshes that have greater than 200 or so vertices. +VRChat 将在运行时自动将 Dynamic Bones 转换为 PhysBones。 -## Reduce the amount of meshes on your avatar -There's two types of Mesh Renderers that your avatar could have on it-- Static Mesh Renderers and Skinned Mesh Renderers. Static Meshes do not deform. Skinned Meshes, however, usually have rigs (bones) that tell the engine how to move and deform the mesh based on the position of the bones. These Skinned Meshes are significantly more expensive, and you should only have one skinned Mesh Renderer on your avatar. There is very little reason to have more than one-- most of the time, additional items can be built into the original model. +## 限制 Cloth(布料)使用量 +Cloth 是 Unity 的默认组件,其性能消耗与 Dynamic Bones 类似,但设置更加困难。请务必严格限制使用 Cloth 组件,且不要将其应用于有着 200 个或以上顶点的网格。 -On top of that, each additional mesh on your avatar incurs one or more additional "Draw Calls"-- essentially, time spent by your processor telling your graphics card to draw something on the screen. +## 限制模型上的网格数量 +您的模型上可能会有两种类型的网格渲染器 —— Static Mesh Renderer(静态网格渲染器) 和 Skinned Mesh Renderer(蒙皮网格渲染器)。Static Meshes (静态网格)不会形变。而 Skinned Meshes (蒙皮网格)通常配备有骨骼(bones),这些骨骼会告诉游戏引擎如何根据骨骼的位置移动和形变网格。这些 Skinned Meshes 的性能消耗更高,您的模型中应只配备一个带有 Skinned Mesh Renderer 的网格。您基本没有理由在模型上使用超过一个 Skinned Mesh Renderer —— 在大多数时候,新添加的其他物体网格可以被集成到初始模型网格中。 -Therefore, **VRChat recommends that you have one Skinned Mesh Renderer at maximum, and 3 static mesh renderers at maximum.** Merging meshes together is very simple in Blender, and is shown in the Meshes video below. +此外,您的模型上的每个额外网格都会产生一个或多个额外的“Draw calls(绘制调用)” —— 也就是处理器决定如何告诉显卡在屏幕上绘制内容 —— 这一过程所花费的时间。 -Finally, ensure that you're not using an excessive amount of triangles. The SDK will warn you if you're trying to upload a model that exceeds 70,000 triangles for PC or 20,000 on Quest. It is very rare that you need even this many polygons for details-- look into baking a normal map and simplifying your mesh via decimation or retopology. +因此,**建议您最多只使用一个 Skinned Mesh Renderer 和最多 3 个 Static Mesh Renderer**。在 Blender 中将网格合并在一起非常简单,下面的网格优化视频会示范这个办法。 + +最后,请确保模型中没有过多的三角面(Polygon)。如果您尝试上传的模型的三角面(Polygon)数超过 70,000(PC)或 20,000(Quest),SDK 会发出警告。通常情况下,即使对于十分细致的模型,您也很少需要这么多的多边形 —— 您可以尝试使用法线贴图进行烘焙,并通过简化或重拓扑来简化网格。 -Creating avatars for the Quest can be more challenging due to the reduced limits. The most effective optimization tends to occur during initial design and avatar creation. In other words, you're going to have problems if you try to take a 120,000 made-for-rendering model and squeeze it into 20,000 polygons. Don't make things harder than they have to be-- find a model that starts low! 20k is quite a large amount of leeway. - -Notably if you are using Cats Blender Plugin, it merges meshes automatically when you "Fix Model". **If you seperate meshes by Material or by Loose Parts using Cats to assist with decimation or editing, do not forget to merge the meshes again.** +由于限制较大,为 Quest 创建模型可能更具挑战性。最有效的优化往往发生在初始设计和创建模型过程中。换句话说,如果您尝试将一个为 3D 渲染用途而创建的, 有 120,000 个多边面的模型压缩到 20,000 个多边面中,您就会遇到问题。"如无必要,勿增实体" —— 您可以从一开始,就找一个面数相对没那么高的模型! + +需要注意的是,如果您使用的是 Cats Blender 插件,点击“修复模型”后,它会默认自动合并网格。**如果您使用 Cats ,并且您有根据材质或松散部件分离网格以辅助减面或编辑,请不要忘记在最后合并网格。** @[youtube](https://www.youtube.com/watch?v=1fco-G2j0Jg) -## Reduce the amount of material slots you use -Each additional material slot is also a draw call, which eats more processor time! If you have a lot of materials (more than 10), look into Texture Atlasing. With Community-created tools, atlasing is exceedingly easy. Check out the Materials video for more details. - -As an aside, what is important is the number of **material slots on the Renderer components** in your avatar. If you have the same material in 20 slots, you still technically have 20 "materials". + +## 减少模型上的材质槽(Material Slot)数量 +每个额外的材质槽也是一个 Drawcall,这将消耗更多的处理器时间!如果您有很多材质(超过 10 个),请考虑使用贴图集(Texture Atlases)。如果您使用社区创建的工具,就可以很容易地制作贴图集(Texture Atlases)。详细信息请参阅下文视频。 -This is due to the way that Unity splits meshes into submeshes. What really matters for performance is the number of submeshes created, which Unity creates based on Material slots. +另外,重要的是您的模型中的渲染器组件上的 **材质槽数量**。如果您在 20 个槽位上使用用一个材质,那么这在代码层面上,仍然等同于使用 20 个“材质”,这是因为 Unity 会将网格拆分成不同的子网格,因此对于性能而言, Unity 基于材质槽而创建的子网格数量也是一个重要的影响方面。 @[youtube](http://www.youtube.com/watch?v=5LwRi26RxSQ) + +## 注意您的显存使用情况! -## Watch your VRAM usage! +即使您使用了贴图集(Texture Atlases),您可能仍然会使用比之前更多的显存! -Even if you use texture atlases, you might end end up using more VRAM than you did before! +贴图占用显存。每个贴图的分辨率越高,它占用的显存就越多。不要使用多个高分辨率贴图,或通过减小 [Unity 的导入设置](https://docs.unity3d.com/cn/2019.4/Manual/class-TextureImporter.html) 中的最大尺寸(Max Size)参数来降低它们的尺寸。 -Textures eat up VRAM. The higher the resolution of each texture, the more VRAM it consumes. Avoid using several high-resolution textures, or reduce their size by reducing the "Max Size" parameter in [Unity's import settings](https://docs.unity3d.com/Manual/class-TextureImporter.html). +例如:不要被模型的下载大小所迷惑,如果使用效率低下的高分辨率贴图,一个 30 MB 的模型*可以*占用 3 GB 的显存! -For example: A 30 MB avatar *can* use 3 GB of VRAM if it uses inefficient high-resolution textures. Don't be fooled by an avatar's download size. +请查看 [Poiyomi 的贴图优化指南](https://www.poiyomi.com/blog/2022-10-17-texture-optimization)。这是一份关于如何优化您的模型贴图的,优秀而全面的指南。 -Check out [Poiyomi's Texture Optimization guide](https://www.poiyomi.com/blog/2022-10-17-texture-optimization). It's an excellent and comprehensive guide on how to optimize your avatar's textures. +## 避免使用计算成本高的着色器 +一些着色器可能会导致 GPU 渲染时花费过多的时间。尽量使用 Unity 标准着色器或您知道的优化良好的着色器。如果您不知道如何判断着色器是否优化良好,没关系!以下是一些示例 —— 本文并非包含了所有可选择的着色器,但这些着色器都是经过精心制作和优化的,具有多种功能。 + * [Xiexe 的“XSToon”Unity 着色器](https://github.com/Xiexe/Xiexes-Unity-Shaders)(MIT)- 用于 Unity 的一组 PBR 卡通着色器。 + * [Silent 的着色器](https://gitlab.com/s-ilent/SCSS)(MIT)- 用于 Unity 的着色器,用于赛璐珞着色(cel shading),最初是基于已停止更新的的 CubedParadox 的 Flat Lit Toon,具有许多有用的功能。 + * [Poiyomi 的 Toon Shader](https://github.com/poiyomi/PoiyomiToonShader/releases)(MIT)- 功能非常强大的着色器,有很多选项。 -## Avoid expensive shaders -Some shaders can cause excessive time spent rendering on the GPU. Try to stick with the Unity Standard shaders, or shaders that you know perform well. If you don't know how to tell if a shader is well-optimized, that's fine! Here are some examples-- these certainly aren't all the shaders available, but are all well-made and well-optimized with a variety of features. - * [Xiexe's "XSToon" Unity Shaders](https://github.com/Xiexe/Xiexes-Unity-Shaders) (MIT) - A collection of PBR 'Toon' shaders for Unity. - * [Silent's Shaders](https://gitlab.com/s-ilent/SCSS) (MIT) - Shaders for Unity for cel shading, originally based off the discontinued CubedParadox's Flat Lit Toon, featuring a number of handy features. - * [Poiyomi's Toon Shader](https://github.com/poiyomi/PoiyomiToonShader/releases) (MIT) - A very robust, powerful shader with a lot of options. +### 减少过多的着色器通道(Shader Passes) +更技术性地说,您应当避免使用过多的着色器通道。这会产生额外的 Draw calls (绘制调用)。这一点可能会让大多数玩家担心过于繁琐,因此,如果您坚持使用常用的和经过验证的社区着色器,就基本足够了。 +::: info 译者注 +着色器通道是着色器程序的单独部分,它们在渲染管线的特定阶段执行,并可用于创建各种渲染效果,例如: +- 阴影映射通道可用于给对象添加阴影。 +- 灯光通道可用于照亮对象。 +- 纹理通道可用于将纹理渲染到对象。 -### Minimize Excess Shader Passes -Speaking more technically, you want to avoid shaders that have excess shader passes. This incurs additional draw calls. This might be a bit too much for most users to worry about, so if you stick with commonly used and proven community shaders, that should suffice. - -### Avoid Tessellation -**You should always avoid using shaders on avatars that use Tessellation.** This is very common in "fur" shaders. [Tessellation](https://en.wikipedia.org/wiki/Tessellation_%28computer_graphics%29) is a method by which your graphics card can take meshes and subdivide them for various effects. However, this effect is **extremely expensive** and will slow down even the most powerful of graphics cards. **Do not use shaders with tessellation effects.** If you want a fur effect, consider looking into shaders that reproduce the effect without tessellation, such as [XSFur](https://xiexe.booth.pm/items/1084711) and [Warren's Fast Fur Shader](https://warrenwolfy.gumroad.com/l/atntv). - -### Keywords -You should also avoid shaders that use excessive amounts of shader keywords. This can cause serious and unpredictable issues with rendering your view in VRChat, and will fill your output log with a lot of redundant error messages. There is no need to include excessive shader keywords in your shader, so please only use the ones that are required for the features you are targeting. - -#### Clearing Keywords -When you change or upgrade your shader, ensure that you remove old, unused keywords from your materials. Having excessive keywords in use is very bad for performance and optimization. Not only will it cause issues with your own avatar, but it may prevent others from seeing **all shaders** properly. +您也可参阅 [Unity 的 Pass 文档](https://docs.unity3d.com/cn/2019.4/Manual/SL-Pass.html)来进一步理解这个概念。 +::: -The VRChat SDK contains a tool to remove keywords from materials on your avatar. This tool can also remove keywords you need, so be careful! + +### 避免使用曲面细分(Tessellation) +**您应该始终避免在模型上使用需曲面细分的着色器。** 而这一功能在毛皮(Fur)着色器中非常常见。[曲面细分](https://en.wikipedia.org/wiki/Tessellation_%28computer_graphics%29) 是一种方法,您的显卡可以使用它来对网格进行细分以实现各种效果。然而,这种效果**计算成本十分巨大**,即使您使用旗舰级显卡,也难逃卡顿。**因此不要使用具有曲面细分效果的着色器。** 如果您想要毛皮效果,请考虑寻找不使用曲面细分的着色器,例如 [XSFur](https://xiexe.booth.pm/items/1084711) 和 [Warren 的 Fast Fur Shader](https://warrenwolfy.gumroad.com/l/atntv)。 + +### Keywords (关键字) +您还应避免使用过多的着色器关键字(Shader Keywords)。这会导致 VRChat 中的渲染画面出现严重且不可预测的问题,并在输出日志中填充大量冗余的错误消息。您的着色器中不需要包含过多的着色器关键字,所以请仅使用那些您所需的关键字。 -Usually, it is best to check the keywords with this tool-- **if you've got too many keywords, you probably need to find another shader.** Swap to Standard, clear keywords, then swap to your new shader. +#### 清除 Keywords (关键字) +当您更改或升级着色器时,请确保从材质中删除旧的未使用的关键字。使用过多的关键字对性能和优化非常不利。它不仅会导致您自己的模型出现问题,还可能阻止其他人正确地看见**所有的着色器**渲染的画面。 -#### Note for Shader Authors -You may want to consider using the keywords reserved by the Standard shader as your own keywords. These are essentially guaranteed to already be reserved, so if you must use keywords, use the ones already defined by Standard and Post Processing v2. Here's a [list of recommended keywords to use](https://pastebin.com/83fQvZ3n). +VRChat SDK 包含一个工具,可以删除模型上材质含有的关键字。这个工具也会删除您所需要的关键字,所以请谨慎使用! -### Alpha Transparency -Alpha transparency is also another expensive part of shaders-- typically you want to be using Cutout or Opaque modes on shaders. Transparency can be quite expensive, so only use it if you know what you're doing! +通常,最好使用这个工具检查关键字数量 —— **如果关键字太多,您可能需要换到另一个着色器。** 这种情况下吗,您需要将材质切换到标准着色器,清除关键字,然后再切换到新的着色器。 -### Measuring Draw Calls -The Unity Profiler can be very useful when judging for how many draw calls you're incurring-- just make sure you turn off shadows on your Directional Light for a level playing field. +#### 着色器作者,请注意 +您可能希望使用标准着色器保留的关键字作为您自己的关键字。这些关键字已经被保留,因此如果您必须使用这些关键字,请使用标准着色器和后处理(Post Processing) V2 已定义的关键字。这是一个推荐使用的[关键字列表](https://pastebin.com/83fQvZ3n)。 -## Reduce the amount of bones -Even if you have a bunch of bones sitting in a scarf, skirt, or your hair that you're not using for anything, they can incur additional costs during skinning calls that your GPU has to worry about. If you're not going to use a bone, consider deleting the bone and merging it into the parent bone. If you want to know how to merge the weights of a bone into its parent, check out the video on Dynamic Bones above, which includes a part on bone merging. +### Alpha 透明度 +Alpha 透明度也是着色器中计算成本大的部分 —— 通常情况下,您希望在着色器上使用 Cutout 或 Opaque 模式。透明度可能会相当耗费性能,因此只有在您知道自己在做什么时才使用它! -## Reduce the emission amount/amount of particle systems -Although particle systems can result in a lot of cool effects, having excessively large amounts of them can cause issues for some PCs. Limit the number of particle systems that you're using, and limit the maximum amount of particles emitting at any one given moment. +### 计算 Draw calls +Unity Profiler 在评估您产生了多少 Draw calls 时非常有用 —— 您只需确保在 Directional Light (平行方向光)上关闭阴影,以保持公平竞争的环境。 + +## 减少骨骼数量 +即使您的围巾、裙子或头发中有许多未被使用的骨骼,它们也会在调用并绘制蒙皮(Skinning calls)期间产生额外的性能成本,让您的 GPU 产生对应负担。如果您不打算使用某个骨骼,请考虑删除该骨骼并将其合并到父骨骼中。如果您想知道如何将骨骼的权重合并到其父骨骼中,请查看上面关于 Dynamic Bones 的视频,其中包含骨骼合并的部分。 -There are ways to have particle systems with large numbers of particles and retain performance. If you are interested in this, look into dynamic batching for sprite particles, don't use collision, and ensure the movement of your particles is simplistic. +## 减少 Emission (发光)量/Particle System(粒子系统)数量 +尽管粒子系统可能会产生很多很酷的效果,但使用过多的粒子系统可能会导致某些电脑出现问题。你最好限制您使用的粒子系统数量,并限制在某一时刻最多发射的粒子数量。 -If you're more technically inclined, you can try looking into Unity's Profiler view to judge how much CPU time your particle simulation is taking. Generally speaking, large transparent particles are worse than a lot of smaller, opaque ones. Unity's Particle System is actually quite optimized and runs quickly *if used well.* +当然,也有办法使用大量粒子的粒子系统同时保持性能。如果您对此感兴趣,请尝试了解关于 Sprite particle(精灵粒子)的动态批处理(dynamic batching),不要开启碰撞(collision)功能,并确保您的粒子的移动轨迹不会过于复杂。 -## Limit the number of Lights your avatar uses -Lights on avatars are real-time, and as such, are exceedingly expensive. Adding a light to your avatar means that everything that your Light touches will render with *double* the draw calls. Additional lights multiply the effect. This is obviously *very bad for performance.* Do not use Lights that are always on. Try using an Animation Override to turn a flashlight on and off, or alternately, do not use Lights at all. +如果您对技术方面较为了解,可以尝试查看 Unity 的 Profiler 窗口,以判断您的粒子模拟所花费的 CPU 时间有多少。一般来说,大尺寸的透明粒子比许多较小的不透明粒子性能消耗更糟糕。Unity 的 Particle System (粒子系统)实际上优化十分良好,如果**使用得当**,那么它的运行速度就会很快。 -If you do use a Light, turn off Shadows for the Light. Shadows on Realtime lights are VERY expensive and often don't look that great on something that moves around. +## 限制模型使用的灯光 (Light 组件)数量 +模型上的灯光是实时的,因此性能成本非常昂贵。在模型上添加灯光意味着,您的灯光照射范围的所有物体渲染时会有**双倍的 Draw calls**。额外的灯光会导致 Draw calls 倍增。这显然*会显著影响性能*。不要使用一直开着的灯光。尝试使用一个动画来打开和关闭手电筒,或者干脆不使用灯光。 -Particle Systems can be configured to have a light on for a number of particles. *Never do this!* Each particle with a light counts as a real-time light, which is (once again) extremely expensive. +如果您确实要使用灯光,请关闭灯光的阴影。实时灯光上的阴影的性能成本非常昂贵,并且在移动的物体上表现效果不佳。 -**In total, VRChat recommends that you do not use Lights of any type on avatars at all.** Not only do they adversely affect your own avatar's performance, they multiply performance cost of avatars the light is hitting as well. +粒子系统可以配置成在一定数量的粒子上打开灯光。**但是请切勿这样做**!因为每个带有灯光的粒子都会计为实时灯光,带来严重的性能消耗。 -## Recommended Software/Plugins -There's a large amount of software available to help you optimize your avatar and make it easier to build avatars. +**总的来说,VRChat 建议您完全不要在模型上使用任何类型的灯光。**它们不仅会对您自己的模型的性能造成不利影响,还会将光线照射到的其他模型的性能开销乘以倍数。 -For example, check out [Pumkin's Avatar Tools](https://github.com/rurre/PumkinsAvatarTools) (MIT) for the Unity Editor. Among other things, this Editor script allows you to quickly see stats on your avatars. This tool is in beta, and may have bugs-- please report any issues on Pumkin's GitHub. +## 推荐的软件/插件 +有很多软件可供您优化模型,并使创建模型变得更容易。 -The following software has not been authored by VRChat. Please read and respect the licensing provided with each individual product. +例如,使用 Unity 编辑器时,来看看 [Pumkin's Avatar Tools](https://github.com/rurre/PumkinsAvatarTools)(MIT)。此编辑器脚本可以让您快速查看模型的统计信息,以及有一些其他功能。此工具处于测试版,可能存在错误,如果有,请在 Pumkin 的 GitHub 上报告这些错误。 + +以下软件不由 VRChat 团队制作。请阅读并尊重每个个别产品附带的许可证。 - [Unity](/creators.vrchat.com/sdk/upgrade/current-unity-version) - [Blender](https://blender.org) -- [Cats Blender Plugin](https://github.com/absolute-quantum/cats-blender-plugin) -- [Shotariya's Material Combiner](https://github.com/Grim-es/material-combiner-addon) +- [Cats Blender 插件](https://github.com/absolute-quantum/cats-blender-plugin) +- [Shotariya 的 Material Combiner](https://github.com/Grim-es/material-combiner-addon) - [Pumkin's Avatar Tools](https://github.com/rurre/PumkinsAvatarTools) \ No newline at end of file diff --git a/docs/creators.vrchat.com/avatars/avatar-scaling.md b/docs/creators.vrchat.com/avatars/avatar-scaling.md index ace2848..f10cc26 100644 --- a/docs/creators.vrchat.com/avatars/avatar-scaling.md +++ b/docs/creators.vrchat.com/avatars/avatar-scaling.md @@ -1,40 +1,35 @@ ---- -title: "Avatar Scaling" ---- +# 模型缩放 -# Technical Considerations around Avatar Scaling +模型缩放允许玩家通过缩放模型的大小,来更改其当前模型的高度。 -Avatar scaling allows players to change the height of their current avatar. +本页面记录了 VRChat 模型缩放的工作原理,以便为开发社区资源提供有用的信息。 -This page documents how VRChat's avatar scaling works internally to the extent that may be useful for developing community resources around it. +阅读[Avatar Events 文档](/creators.vrchat.com/worlds/udon/players/player-avatar-scaling) 或我们的[示例脚本](/creators.vrchat.com/worlds/examples/udon-example-scene/avatar-scaling-settings)以了解如何在 Udon 中使用模型缩放。 +阅读[模型动画参数](/creators.vrchat.com/avatars/animator-parameters#模型动画参数列表)页面,了解与缩放相关的可用模型参数。 -Read the [Avatar Events documentation](/creators.vrchat.com/worlds/udon/players/player-avatar-scaling) documentation or our [example script](/creators.vrchat.com/worlds/examples/udon-example-scene/avatar-scaling-settings) to learn how to use avatar scaling with Udon. -Read the [Avatar Parameters](/creators.vrchat.com/avatars/animator-parameters) page for available avatar parameters related to scaling. +## 术语定义 +* **视角球高度**:模型姿势为 T-Pose 时,其视角球距离模型原点的 Y 轴垂直高度。 +* **预制体高度**:当缩放为默认值时,模型的视角球高度。您可以在 SDK 中 Avatar Descriptor 中的 Viewpoint 里更改这个值。 +* **目标视角球高度**:由玩家或 Udon 设置的,要缩放到的视角球高度。 +* **模型缩放比例**:目标视角球高度对预制体高度的比例。例如,如果目标视角球高度为 4.5 米,预制体高度为 1.5 米,则"模型缩放比例"为 3。 -## Term Definitions +## 高度限制 -* **Eye Height**: The height above 0 (Y component in transform position) of an avatar's viewpoint while in a T-Pose. -* **Prefab Height**: The eye height of an avatar when scaling is at its default value. This is what you configure in the SDK by placing the "View Position". -* **Target Eye Height**: The eye height an avatar wants to be scaled to, as set by either the player or Udon. -* **Avatar Scale**: The ratio between "Prefab Height" and "Target Eye Height". For example, if the target is 4.5 meters, and the prefab height is 1.5 meters, then "Avatar Scale" is 3. +**预制体高度**不受限,因此您可以在 SDK 中,为模型视角球设置任意高度。但请注意,这种情况下您的**模型缩放比例**会影响您的性能等级。 -## Range of Values +在 Udon 中,**目标视角球高度**高度限制的上下限分别为 100 米和 0.1 米,而在模型菜单中,它们分别为 5 米和 0.2 米。通过上传超出高度限制的模型 ,且*不在其菜单里使用*模型缩放功能,那么您的**目标视角球高度**不受限,且与您模型的**预制体高度**一致。 -The "Prefab Height" is not limited. You can put your avatar's "View Position" at any height in the SDK. Note, however, that your overall avatar scale will affect your performance rank. +因此,您必须在世界的 Udon 脚本中的 “avatar eye height changed” 事件上重新应用缩放,以强制执行模型缩放。否则,玩家可以切换到上传时超出高度限制的模型,以绕过世界 Udon 的高度限制。 -The "Target Eye Height" is clamped between 0.1 and 100 meters for Udon, and the usable range of scaling in your Action Menu goes from 0.2 to 5.0 meters. But by uploading an avatar that is outside this range and _not_ using the scale dial, you can still exceed those limits. In that case, "Target Eye Height" will match "Prefab Height," which is not limited. +您可以在 VRChat 网站中关闭世界的缩放功能,届时世界内玩家模型的**目标视角球高度**将始终与**预制体高度**一致。 -This restriction means that Udon _must_ re-apply scales on "avatar eye height changed" events to fully enforce scale. Otherwise, users can switch to shorter or taller avatars to bypass the limits put in place by the world. +## 模型缩放的原理 -In worlds where scaling is disabled via the website, "Target Eye Height" will _always_ match "Prefab Height." +模型缩放等同于更改玩家模型根变换的 "localScale(本地缩放)" 数值。**此类缩放是强制性的**。玩家除了利用模型缩放相关的 Udon 函数外,无法通过其他方式覆盖模型的根变换缩放。 -## How Scaling is Applied +每当模型的缩放数值发生变化时(例如切换或重置/重新加载当前模型),将会重新定位您的视角球高度,并重新定位一些内部组件(例如您的声音位置)。 -Scaling an avatar works by changing the "localScale" of the avatar's root transform. **This scale is enforced**. There is no user-accessible way to override the scale of the root of an avatar other than the Udon functions relating to avatar scaling. +定位完成后,您当前的视角球高度将作为 **EyeHeightAsMeters** 参数自动同步给每个远端玩家,精度为 3 个小数点。而当远端玩家接收到新的**EyeHeightAsMeters**参数时,会在短时间内将对应模型平滑缩放到**目标视角球高度**。 -Whenever the scale is changed (i.e., whenever you switch avatars, or reset/reload your current one), the avatar is "remeasured" locally. This process adjusts your viewpoint to match the new height and repositions a few internal components, such as your voice position. - -Scale is automatically synchronized for each player as "eye height", quantized to 3 decimal points. For remote users, scale changes are smoothed over a short period any time a new height is received. - -While using the scale dial in your Action Menu, your avatar is only scaled in mirrors. When confirming the scale on the dial, the new scale will instantly be applied to your avatar and then sent to remote users. \ No newline at end of file +当您在模型菜单中旋转模型高度转盘时,您的模型只在本地客户端的镜子中进行预览性的缩放。在确认目标缩放高度后,新的视角球高度将立即应用于您的玩家模型,并作为 **EyeHeightAsMeters** 参数同步给远端玩家。 \ No newline at end of file diff --git a/docs/creators.vrchat.com/avatars/creating-your-first-avatar.md b/docs/creators.vrchat.com/avatars/creating-your-first-avatar.md index 62eaa51..39d1fab 100644 --- a/docs/creators.vrchat.com/avatars/creating-your-first-avatar.md +++ b/docs/creators.vrchat.com/avatars/creating-your-first-avatar.md @@ -1,24 +1,24 @@ -# 创建您的第一个形象 -## 要求:首先设置好 SDK ! -在开始之前,请确保已经有一个[已安装SDK的 Unity 项目](/creators.vrchat.com/sdk/)。 +# 创建您的第一个虚拟形象 +## 请首先设置好 SDK ! +在开始之前,请确保已经有一个[已安装 SDK 的 Unity 项目](/creators.vrchat.com/sdk/)。 -设置好 SDK 后,请查看我们的示例形象。打开形象项目,转到 `VRChat SDK > Samples > Avatar Dynamics Robot Avatar`。 +设置好 SDK 后,请查看我们的示例模型。打开模型项目,转到 `VRChat SDK > Samples > Avatar Dynamics Robot Avatar`。 -![这个示例虚拟形象可以帮助您理解一个完整的 VRChat 虚拟形象项目是什么样子的。](/creators.vrchat.com/images/avatars/creating-your-first-avatar-3dfc191-Unity_YrUFLEWWDe.png) +![这个示例模型可以帮助您理解一个完整的 VRChat 虚拟形象项目是什么样子的。](/creators.vrchat.com/images/avatars/creating-your-first-avatar-3dfc191-Unity_YrUFLEWWDe.png) ::: info 需要帮助? -制作您的第一个形象通常是个充满挑战的过程。如果您遇到了问题,您可以从以下几个渠道寻求帮助: +制作您的第一个虚拟形象通常是个充满挑战的过程。如果您遇到了问题,您可以从以下几个渠道寻求帮助: - 阅读我们的文档(就是您现在正在做的事!) - 浏览我们的[官方论坛](https://ask.vrchat.com/) - 加入我们的 [Discord 服务器](https://discord.com/invite/vrchat) ::: -## 第 0 步 - 创建模型 -虽然大多数用户选择找一个模型来代替(详见 [步骤 1 - 找个模型](/creators.vrchat.com/avatars/creating-your-first-avatar#step-1-%E2%80%93-%E5%AF%BB%E6%89%BE%E4%B8%80%E4%B8%AA%E6%A8%A1%E5%9E%8B)),但从头开始创建一个形象模型也不是不行。您可以使用任何您喜欢的 3D 软件,只要它支持导出带有骨骼的 FBX!Blender 和 Maya 是非常常见的选择。 +## 第 0 步 - 制作模型 +虽然不少人会选择直接找个模型来继续(详见 [步骤 1 - 找个模型](/creators.vrchat.com/avatars/creating-your-first-avatar#step-1-%E2%80%93-%E5%AF%BB%E6%89%BE%E4%B8%80%E4%B8%AA%E6%A8%A1%E5%9E%8B)),但如果你想的话,您也可以从头开始制作一个模型。您可以使用任何您喜欢的 3D 软件,只要它支持导出带有骨骼的 FBX!您可以选择使用 Blender 和 Maya ,它们都是常见的选择。 -让我们明确一点:对于从未做过 3D 建模的人来说,这是一段漫长旅程的开始。学习 3D 建模很复杂,学习绑骨和贴图也很复杂。创建一个配置好的角色需要综合运用所有这些技能! +首先要明确一点:对于从未做过 3D 建模的人来说,这是一段漫长旅程的开始。学习 3D 建模很复杂,学习绑骨和贴图也很复杂。创建一个配置好的角色需要综合运用所有这些技能! 如果您选择创建自己的模型,我们建议您从简单的开始。即使它看起来不会像那些预制模型那么好看,但这是*您自己*的模型,您可以对它做任何您想做的事情。 diff --git a/docs/creators.vrchat.com/avatars/expression-menu-and-controls.md b/docs/creators.vrchat.com/avatars/expression-menu-and-controls.md index 75e9104..9ee832d 100644 --- a/docs/creators.vrchat.com/avatars/expression-menu-and-controls.md +++ b/docs/creators.vrchat.com/avatars/expression-menu-and-controls.md @@ -1,56 +1,77 @@ ---- -title: "Expression Menu and Controls" ---- +# Expressions Menu 与 Controls + +::: warning 阅读本篇文章需要特定的前置知识 -# Expression Menu and Controls +您需要先了解 [Unity 动画控制器](https://.unity3d.com/cn/2019.4/Manual/class-AnimatorController.html) ,这样能帮助您更好的了解本文。 -::: warning Unity Knowledge Required +::: -This document is written with the assumption that you know a bit about [Unity Animators](https://docs.unity3d.com/2019.4/Documentation/Manual/class-AnimatorController.html). +## 创建 Expressions Menu (模型菜单) -::: +1. 在 Unity 项目窗口中,在 Assets 文件夹单击鼠标右键,选择`Create/VRChat/Avatars/Expressions Menu` +2. 打开`Expressions Menu`文件以自定义它。(见步骤13) + +在继续之前,您需要创建一个**Expression Parameters**资源,您可以在其中您模型上使用的所有自定义参数。 + + + +3. 在Assets文件夹中右键单击,选择`Create > VRC Scriptable Objects > Expression Parameters`。 +4. 打开`Expression Parameters`文件以自定义它。 + + - 该资源默认包含[三个参数](/creators.vrchat.com/avatars/animator-parameters#vrchat-动画器默认参数)(`VRCEmote`、`VRCFaceBlendH`、`VRCFaceBlendV`)。如果您用不到这些参数,则可以直接删除它们, +5. 输入您的参数名称。 + - 这些名称应与您的动画器中的参数匹配。 + - 您可以使用`/`对参数进行分类。例如,`Clothing/Hoodie`和`Clothing/Hat`。 + - VRChat 有一些[内置参数](/creators.vrchat.com/avatars/animator-parameters#模型动画参数列表)。您可以直接在动画器中使用它们,无需添加它们到您的`Expression Parameters`文件。 +6. 为每个参数选择一个类型。 -## Creating An Expression Menu + - `Int`范围为 0 - 255 。 + - `Float`范围为 -1.0 至 1.0 。 + - `Bool`为`True`(真)或`False`(假)。 +7. 更改`Default`值以设置每个参数的默认值。当模型被重置时,参数将恢复为此值。 +8. 如果您希望某个自定义参数的值不会随着切换世界或模型被重置,请启用`Saved`。 +9. 如果您希望此参数的值应同步给所有远端玩家,请启用`Synced`。 -1. Right-click in the Unity project, select `Create/VRC Scriptable Objects/Expressions Menu` -2. Select the new object in the project +接下来,您应将这两个资源添加到您的`VRCAvatarDescriptor`中。 -You'll also need to create a ExpressionParameters object, where you can define all of the custom parameters you're using. You can name them here, as well as define their type. You create one the same way as above: + -3. Right-click in the Unity project, select `Create/VRC Scriptable Objects/Expression Parameters` -4. Select the new object in the project. -5. Set up your custom parameters with names and types. `Int` has a range of 0-255, Float has a range of -1.0 to 1.0. You can access your parameters with your custom names to make organization easier. +10. 选择您的`VRCAvatarDescriptor`并向下滚动到`Expressions`部分。 +11. 将“Menu”属性更改为您的表情菜单。 +12. 将“Parameters”属性更改为您的表情参数。 -After this, you'll need to go back to your Expressions Menu. +在将这两个资源添加到您的`VRCAvatarDescriptor`之后,您可以在模型菜单中看见,并自定义所有模型参数。 -6. In the inspector click "Add Control". Up to 8 controls can be added to a menu. -7. You can also name states, add icons, and change the order of the controls here. -8. When complete, drag this object to the "Expressions Menu" property in the Avatar Descriptor. -9. Drag your Expressions Parameters object to the "Expressions Parameters" property in the Avatar Descriptor. + -FYI: we've included some default icons you can use in `VRCSDK/Assets3/Expression Menu Icons/` . +13. 在检查器中,单击`Add Control`。一个菜单最多可以添加 8 个控件。 +14. 选择一个名称和[类型](/creators.vrchat.com/avatars/expression-menu-and-controls.md#controls-(操作控件)类型)。 +15. 您还可以在这里添加图标和子菜单,或更改控件的顺序。 + - 您可以在`Packages/VRXhat SDK - Avatars/Samples/AV3 Demo Assets/Expressions Menu`中找到一些默认图标。 -### Types of Controls +### Controls (操作控件)类型 -* **Button** - Sets a parameter when clicked, then resets after the sync/reset has been sent-- usually after about a second. Cannot be held down. -* **Toggle** - Sets a parameter when the toggle is on, resets when the toggle is turned off -* **Sub-Menu** - Opens another Expression Menu. Additionally it may also set a parameter when entered, if so that parameter is reset to zero when you exit that menu. - * **Important note:** You can put sub-menus into sub-menus! +* **Button** - 单击时设置参数,在发送同步值或重置模型的一秒钟后重置参数。不能长按。 +* **Toggle** - 打开开关时设置参数,关闭开关时重置参数。 +* **Sub-Menu** - 打开另一个模型菜单。此外,如果进入该菜单时设置了参数,则退出该菜单时将重置该参数。 + * **重要提示:** 您可以嵌套(套娃)设置子菜单! -* **Two Axis Puppet** - Opens an axis puppet menu that controls two float parameters depending on the joystick position. The parameters are mapped to vertical and horizontal. The float values range from -1.0 to 1.0. -* **Four Axis Puppet** - Opens an axis puppet menu that controls four float parameters depending on the joystick position. The parameters are mapped in order, up, right, down, left. The float values are 0.0 to 1.0. -* **Radial Puppet** - Open a radial puppet menu that controls a single float parameter, kind of like a progress bar that you can fill! The float value is 0.0 to 1.0. +* **Two Axis Puppet** - 打开一个摇杆圆盘菜单,根据摇杆位置控制两个浮点参数。参数映射到垂直和水平方向。浮点值的范围是-1.0至1.0。 +* **Four Axis Puppet** - 打开一个摇杆圆盘菜单,根据摇杆位置控制四个浮点参数。参数按顺序映射为上、右、下、左。浮点值的范围是0.0至1.0。 +* **Radial Puppet** - 打开一个转盘圆盘菜单,控制单个浮点参数,就像一个您可以手动控制的进度条!浮点值的范围是 0.0 至 1.0。 -::: info Puppet Menu Sync +::: info 圆盘菜单同步 -The **Puppet** controls use [**IK Sync**](/creators.vrchat.com/avatars/animator-parameters#sync-types) when open. If you want sync that is as close as possible to your inputs for fast/quick movements, you should use a Puppet menu. +**Puppet** (圆盘)菜单在打开时使用[**IK** ](/creators.vrchat.com/avatars/animator-parameters#参数同步模式)同步模式。如果您希望同步速度能尽量匹配输入速度,以实现快速操作,可以使用 Puppet (圆盘)菜单。 -**Button**/**Toggle** uses **Playable Sync** which updates on-demand, instead of continuously, and is appropriate for things you "turn on/off" but don't need highly precise syncing. +**Button**/**Toggle** 使用 **Playable**同步模式,它按需瞬时更新,而不是持续更新,适用于不需要高度精确同步的内容,例如开关物体。 -Puppet menu sync always updates at the maximum rate available, and it smooths the values for remote users - much better when timed replication is important. +Puppet 菜单同步始终以最大速率更新,并且它平滑了远端玩家的值-当您十分需要定时同步时,这个菜单的表现效果更好。 ::: -Puppet controls may also set a parameter when entering the menu. +Puppet 菜单还可以在进入菜单时设置参数。 -If you use Joystick press to exit, then the parameters being puppeted will remain as their value until you change them again-- either by re-entering a puppet menu that uses those params, or using them elsewhere. \ No newline at end of file +如果使用摇杆按下退出,则被操作的参数的值将保持不变,直到您再次更改它们--无论是重新进入使用那些参数的 Puppet (圆盘)菜单,还是在其他地方使用它们。 + + \ No newline at end of file diff --git a/docs/creators.vrchat.com/avatars/playable-layers.md b/docs/creators.vrchat.com/avatars/playable-layers.md index 91c0194..9cfd806 100644 --- a/docs/creators.vrchat.com/avatars/playable-layers.md +++ b/docs/creators.vrchat.com/avatars/playable-layers.md @@ -1,141 +1,164 @@ --- -title: "Playable Layers" -description: "Create simple or complex animations for your VRChat avatar" +title: "可播放层" +description: "为您的VRChat模型创建简单或复杂的动画" --- -# Playable Layers +# Playable Layers (可播放层) + +当您为 VRChat 模型创建动画时,您不可避免的会用到 VRChat 的 “Playable Layers” 。它们允许您将一些模型上的动画拆分为单一的特定部分,例如奔跑、跳跃、竖起大拇指、微笑、摇尾巴或是它们的组合。 + +::: warning 您需要了解动画控制器 -When you create animations for your VRChat avatar, you'll utilize VRChat's 'Playable Layers.' They allow cleanly separate some things you might want to do with your avatar into their own animations - such as running, jumping, giving a thumbs-up, smiling, wagging your tail, and combinations of these. -::: warning Unity Knowledge Required - -This document is written with the assumption that you know a bit about [Unity Animators](https://docs.unity3d.com/2019.4/Documentation/Manual/class-AnimatorController.html). +本文假设您对[ Unity 动画控制器](https://docs.unity3d.com/2019.4/Documentation/Manual/class-AnimatorController.html)有一定了解。 ::: -In the Avatars 3.0 Avatar Descriptor, there are five buttons labeled : -- Base -- Additive -- Gesture -- Action -- FX +在Avatars 3.0模型描述符中,有五个标签按钮: +- Base(基础) +- Additive (叠加) +- Gesture (手势) +- Action (动作) +- FX (特效) -Generic avatars only have three buttons: +通用骨架的模型只有三个按钮: - Base - Action - FX - -These are **Playable Layers**. Each of them takes a Unity Animator, and they layer on top of each other. In other words, you've got five root animators to play with, and each of them can have several **Animator Layers**. - -These layers apply in order-- in other words, Base gets applied, then Additive, then Gesture, Action, FX. For example, if something in Additive animates a bone (with 1.0 weight), and then something in Action animates that same bone (with 1.0 weight), the Action animation will take precedence. - -We have example Playable Layers available in the SDK. Depending on how you learn and iterate on things, it might be easier for you to use and edit these default layers to figure things out! - -When you are running VRChat and you're wearing (or viewing) an Avatar 3.0 avatar, all of these Playable Layers are put together into a combined Animator. This Animator is the root, main animator of your avatar, and you can control any part of it. **This means that there is no reason to add any additional animators on your avatar.** - -As an aside, you should never use the same controller in multiple Playable Layers. This may work for some setups, but it is **very** poor practice and will cause major issues as you expand the functionality of your avatar. -::: danger Only Use Animation Controllers - -We only support the use of Animation Controllers in Playable Layer slots. Do not use any other type of controller-- you will run into errors or will be unable to upload the content. + + + + + + + +这些都是 **Playable Layers**。每个 Playable layer 都会使用一个 Unity 动画控制器,并且它们会层叠在一起。换句话说,您有五个根动画控制器可供使用,每个控制器都可以有多个**Animator Layers(动画层)**。 + +这些层按顺序应用 —— 先应用 Base ,然后是 Additive ,然后是 Gesture 、 Action 和 FX 。例如,如果 Additive 中的某个动画影响到了某一个骨骼(权重为 1.0 ),然后 Action 中的某个动画也影响到了同一个骨骼(权重为 1.0 ),那么 Action 的动画将在 Additive 的动画的基础上生效。 + + +我们在 SDK 中提供了 Playable layers 的示例。根据您的学习与迭代方式,您可以尝试使用和编辑这些默认的 layers 来帮助您更好的理解它们的工作原理! + +当您运行 VRChat 并且正在使用或预览一个 Avatars 3.0 模型时,所有的这些 Playable layers 都会移动并整合到另一个单独的动画控制器中。这个动画控制器是您模型的根动画控制器,而且您可以随意控制这个动画器的任意部分。**也就是说您没有必要在您的模型上添加任何额外的动画控制器。** + + + + +另外,您不应该在多个 Playable layers 中使用相同的控制器。这在某些特定的应用场景中可能有效,但这是效率**非常低**的做法,并且会在扩展模型功能时引发严重问题。 +::: danger 请只使用动画控制器 + +我们只支持在 Playable layers 插槽中使用动画控制器。不要使用除动画控制器以外的任何其他类型的控制器——否则您将遇到错误或无法上传内容。 ::: -What do these Playable Layers do? Here's the short version: - -**Base:** Stuff that should always play, react to movement (like locomotion), or the locomotion state of your avatar (running, falling, crouching, etc). Transform animations only. -**Additive:** Stuff that Base is already using, but you want to "add" to it-- like a breathing animation. Transform animations only. -**Gesture:** Things that get triggered by hand OR by the Expression menu. You can also use this for "idle animations" like a wagging tail, flapping wings, or moving ears. Transform animations only. -**Action:** Full override, similar to AV2 emotes. Transform animations only. -**FX:** Same as Gestures, but for everything that *isn't* a Transform position, rotation, or scale animation. - -That's great, but let's go into some more detail. + + + + + + + + + + +这些 Playable layers 的功能是什么?以下是简短的说明: + +**Base:** 包括会长期生效于模型的动画,这些动画会对移动做出反应(如运动),或对模型的运动状态(奔跑、下落、蹲下等)做出反应。仅使用变换动画。 +**Additive:** 包括您想附加到 Base 动画器中的动画,比如呼吸动画。仅使用变换动画。 +**Gesture:** 包括由您的手部或表情菜单触发的,甚至常驻的状态动画,如摇尾巴、扇动翅膀或移动耳朵。仅使用变换动画。 +**Action:** 完全覆盖,类似于 AV2 表情。仅使用变换动画。 +**FX:** 与手势相同,但用于除变换位置、旋转或缩放动画之外的所有内容。 + +下文会详细的讲解它们: ## Base -The Base layer contains locomotion animations, including blend trees for walking, running, strafing. It also includes animation states for jumping, falling, falling fast, crouching, and crawling, among other things. +Base 动画器包含运动动画,包括行走、奔跑、横向移动的混合树。它还包括跳跃、下落、快速下落、蹲下和爬行等动画状态。 -Keep in mind that if you put something in here, you'll have to redefine your locomotion animation states. This is pretty complex! Take a look at the example Base Playable Layer to see how complex it can get. +请记住,如果您将某些内容放在这里,您将需要重新定义您的运动动画状态。这非常复杂!您可以查看示例基础 Playable layers ,来了解它可以变得多么复杂。 -Animations in Base should _only_ affect transforms, and all layers should be using Avatar Masks to ensure you're only affecting the appropriate transforms. +Base 中的动画应仅影响变换,并且其中的所有层都应使用 Avatar Mask 来确保只影响适当的变换。 ## Additive -The Additive layer is meant for additive transform movement on top of humanoid bones that are animated in Base-- things like breathing animations that can "add on" to the Base layer. - -**If you want to add an idle animation to non-humanoid bones-- like a tail, ears, or etc-- use Gesture instead!** Additive is *specifically* for humanoid bones. + Additive 动画器用于在 Base 动画器上叠加变换移动,这些变换移动是作用在 Base 动画器中动画的人形骨骼上的——例如呼吸动画,可以“添加”到 Base 动画器上。 + +**如果您想要为非人形骨骼(如尾巴、耳朵等)添加常驻动画,请使用 Gesture 动画器!** Additive 动画器*专门*用于人形骨骼。 + + Additive 动画器很特殊,因为它总是设置为“叠加”混合模式。简而言之,如果在运动过程中有一个变换移动,Additive 里的动画将在其上“叠加”动画。如果在 Additive 动画器中对骨骼进行了可能离谱的操作,那么骨骼可能会表现得非常奇怪,因此请尽量保持该层的动画相对简单。 -The Additive layer is special because it is _always_ set to "Additive" blending. In short, if you've got a transform that moves during locomotion, the Additive animation will "add" its animation on top. This can act really weirdly if you do crazy things to bones in Additive, so try to keep it pretty minimal. +::: warning Additive 动画器中首层的 Avatar Mask 会被忽略 -::: warning Additive First Layer Avatar Mask Ignored - -The first layer (base layer, 0th layer, etc)'s Avatar Mask is ignored. This is for internal masking purposes. You can still mask other layers, but any mask you apply to the first layer will be ignored. +Additive 动画器中的第一个层的 Avatar Mask 将被忽略。这是为了内部遮罩目的。您仍然可以对其他层进行遮罩,但是您应用于第一个层的任何遮罩都将被忽略。 ::: -Animations in Additive should _only_ affect transforms. - + Additive 中的动画应仅影响变换。 + ## Gesture -The Gesture layer is for animations that need to act on individual body parts while still playing the underlying animations for the rest of the body. Kind of like AV2 Gestures, but applied to any part of the body. +Gesture 动画器用于在剩余身体部分有基础动画时,对个别身体部位进行动画处理。这种工作方式有点像 AV2 手势,但适用于身体的任何部位。 -Utilize Avatar Masking to ensure that the animations *only* affect the parts of the avatar you want to animate! So, if you want your gesture parameters to only make hand shapes for left/right hand, you'll want to mask out those hands on each of the layers. +利用 Avatar Masking,确保动画*仅*影响您想要动画化的模型部位!因此,如果您希望手势参数仅为左/右手制作手势形状,您将需要在每个层上屏蔽这些手部。 -In addition, if you want to have an "idle" animation for non-humanoid bones like a tail, wings, ears, etc-- Gesture is where you should put it. +此外,如果您想要为非人形骨骼(如尾巴、翅膀、耳朵等)创建常驻动画,应将其放在 Gesture 动画器中。 -Animations in Gesture should _only_ affect transforms. +Gesture 中的动画应仅影响变换。 ## Action -The Action layer is for bone animations that will override all other layers, when you need to take over total control of the character. Basically, think AV2 "Emotes". +动作层用于覆盖所有其他层的骨骼变换动画,当您需要完全控制模型时。基本上,就像 AV2 的“表情”。 -This layer is **blended to zero by default.** Before you do anything in the action layer, you need to use the [Playable Layer Control State Behavior](/creators.vrchat.com/avatars/state-behaviors#playable-layer-control) to blend this layer up before transitioning to the actual action you're performing! Make sure you blend it back to zero when you're done. +该层**默认情况下混合为零**。在动作层中做任何操作(也就是过渡到任何要执行的动作动画)之前,您需要使用[ Playable layers 控制状态行为](/creators.vrchat.com/avatars/state-behaviors#playable-layer-control)提升该层的权重值,并且确保在想执行的动画结束后将其权重值降低为 0 。 -Animations in Action should _only_ affect transforms. +动作层中的动画应仅影响变换。 ## FX -FX is a **special layer.** On every other layer, you should not be using material animations, shader property animations, or blend shape animations, because they aren't copied to your mirror clone. Only transforms are. +特效是一个**特殊的层**。在其他每个层中,您不应使用材质动画、着色器属性动画或形态键动画,因为它们不会复制到您的镜像克隆中。只有变换会被复制。 -However, in the FX layer, everything is copied over! In other words, ***everything that isn't a humanoid transform/muscle animation should go into the FX layer.*** This includes (but is not limited to) things like enabling/disabling GameObjects, components, material swaps, shader animations, particle system animating, etc. +然而,在特效层中,所有内容都会被复制!换句话说,***除了人形变换/肌肉动画之外的所有内容都应放在特效层中。*** 这包括(但不限于)启用/禁用游戏对象、组件、更换材质、着色器动画、粒子系统动画等。 -The mask in the first FX layer, by default is empty, this will (at avatar init) create a default mask that disables all humanoid muscles, but enables all GameObject animations. This means that any animations in the hierarchy should work, although it is still NOT RECOMMENDED to animate transforms here. +第一个特效层中的遮罩默认为空,这将在模型初始化时创建一个默认遮罩,禁用对所有人形骨骼的,但启用对其他所有游戏对象的动画化。这意味着层次结构中的任何动画都应该正常工作,尽管在此处仍然**不建议**对变换进行动画处理。 -If you have non-muscle animations in your gestures (eg. your Gesture [mask](https://docs.unity3d.com/2019.4/Documentation/Manual/class-AvatarMask.html) has any transforms checked at the bottom) those same transforms must be DISABLED in your FX mask. This will allow your Gesture animations to "show through" the FX layer. +如果您在手势中有非骨骼变换动画(例如,您的手势[遮罩](https://docs.unity3d.com/2019.4/Documentation/Manual/class-AvatarMask.html)中在底部中有被勾选的变换),那么在 FX 动画器的遮罩中必须将这些变换禁用。这将使您的手势动画能够透过FX层显示。 + +::: info 示例 -::: info Example +假设您的模型具有以下设置: +- 模型上有一个尾巴(一系列不属于人形层次结构的骨骼)。 +- 手势动画器中,动画化尾巴的一层动画层具有特殊的遮罩,遮罩中只启用了尾巴的骨骼。 +- 其他手势动画层具有“全部部位遮罩”,其中也包括了在控制器的其余部分中动画化的其他身体部位。 -Let's say your avatar has the following setup: -- You have a tail on your avatar (a chain of bones not part of humanoid hierarchy). -- Your Gesture animator layer for the tail has a special mask with only the chain of bones enabled. -- Your other Gesture animator layer with an "all-parts mask" also has those bones checked (along with the other body parts animated in the rest of the controller). - -In this case, you'd also want to create a custom mask in the first FX layer. This would mask OFF all the muscles (human diagram all red) and mask OFF all the bones in the tail. -You'd also want to make sure this mask has the checkboxes ON for any transforms that have components you will be animating for FX. E.g. a body skinned mesh for animating blend shapes or materials. +在这种情况下,您还需要在第一个 FX 层中创建一个自定义遮罩。这将在 FX 里禁用所有人体骨骼与尾巴中的所有骨骼。 + +您还需要确保此遮罩对于您将要在 FX 动画器中处理的任何变换都打开了复选框。例如,用于动画化形态键或材质的身体蒙皮网格。 ::: -Note that if you have a game object in your hierarchy that has both an animated transform (in Gesture) and an animated effect component (in FX), this will not work with the requirements for the masks. This can occur if you have a simple static-mesh embedded in your hierarchy that you are animating in Gesture, but also applying a material change to in FX. Another example, would be putting a particle effect component directly on the example tail bones above. The simple workaround is to make a child game object and put the static-mesh or effect on that. You would not animate the transform of the child, only the parent. If you follow these steps, you should not need to put transform animations in the FX layer. +请注意,如果您的层次结构中有一个游戏对象,它既有一个在手势中动画化的变换(例如,您在手势中动画化的尾巴)又有一个在特效中动画化的效果组件,这将无法满足遮罩的要求。如果您的层次结构中有一个简单的静态网格嵌入式游戏对象,您在手势中进行动画处理,但在特效中进行材质更改,就会出现这种情况。另一个例子是直接将粒子效果组件放在上述示例尾巴骨骼上。简单的解决方法是创建一个子游戏对象,并将静态网格或效果放在其中。您不会对子对象的变换进行动画处理,只对父对象进行动画处理。如果按照这些步骤操作,您就不需要在FX层中放置变换动画。 -## Additional Poses -There are some additional poses available for Avatars 3.0 avatars. The buttons for these are under the Playable Layers. +## Additional Poses(额外姿势) +Avatars 3.0模型还提供了一些额外的姿势。这些按钮位于 Playable layers 下方。 ### T-Pose -You can now provide your own T-Pose! - -The T-Pose is used to determine various measurements of your avatar, especially for placement of your viewpoint (or view-ball). Viewpoint is dependent entirely on where your view-ball is when your avatar is in this T-Pose animation you provide. +您现在可以提供自己的 T-Pose 动画器! -![Standard T-Pose - [Mixamo](https://www.mixamo.com)](/creators.vrchat.com/images/avatars/playable-layers-1.png) +T-Pose 动画器用于测量您的模型的各种指标,尤其用来确定 viewpoint(视角球)的放置位置。viewpoint 完全取决于您的视角球在您提供的 T-Pose 动画中的位置。 -Secondly, it is important for the wrist alignment/twist. The way your wrists are lined up in relation to the palm-down position will affect how your controller twisting in space will turn your wrist and arm. +![标准 T-Pose - [Mixamo](https://www.mixamo.com)](/creators.vrchat.com/images/avatars/playable-layers-1.png) -Finally, your t-pose determines your wingspan-- your full length of your arms when in T-Pose. This also determines your avatar's interpupillary distance (IPD), or the distance between your avatars eyes. Having arms that are too long will make your IPD wider, making everything seem smaller. Having arms that are too short will make your IPD narrower, making everything seem larger. +其次,T-Pose 动画器对于手腕的对齐/扭转非常重要。手腕相对于向下的手掌的对齐方式将影响手柄在空间中扭转手腕和手臂的方式。 -In addition, (significant) joint bends in T-Pose aren't a good thing. As an example, if your elbows are bent in T-pose, this may affect many different things about your avatar that work off your proportions. +最后,您的 T-Pose 动画器决定了您的臂展——您在 T-Pose 下的两只手臂的完整长度。这还确定了您模型的瞳孔间距(IPD),即您模型眼睛之间的距离。手臂过长会使您的 IPD 变宽,让您的视野更大,视野里的物体更小。手臂过短会使您的 IPD 变窄,让您的视野更小,视野里的物体更大。 -### IK Pose -IK Pose is used to determine major joint bends. In the IK pose, your joints should be bent slightly in the direction they're intended to bend. +此外, T-Pose 中的(显著的)关节弯曲并不是一件好事。例如,如果您的 T-Pose 中的肘关节是弯曲的,这可能会影响与您的比例相关的模型的许多不同方面。 + +### IK Pose (IK 姿势) +IK Pose 用于确定主要关节的弯曲。在 IK 姿势中,您的关节应该以其预期弯曲的方向,来稍微弯曲。 -As an example, VRChat will look at the elbow bend from your IK Pose and determine if there is a angle bend in any given direction. That bend determines how your elbow bends. +例如,VRChat 将检查您的 IK 姿势中的肘关节,并确定其是否有在任一方向上有一个弯曲角度。您的肘关节可以在这个给定角度上进行弯曲。 -The foot's rotation in IK Pose will determine how the knees will bend. This is set by first assuming the knee will bend straight forward relative to the avatar, then saving that direction against the foot's rotation in IK Pose. For example if the feet are pointed toes outward in IK Pose, that means the inside edge of the foot is more forward facing and therefore the knees will bend towards the inside edge of the foot. In the opposite case, if the feet are pointing more inward in IK Pose, the outside edge of the the foot is more forward facing (straight forward direction relative to the avatar) and so the knee will tend to bend towards the outside edge of the foot in that case. +脚在 IK 姿势中的旋转将决定膝盖的弯曲方式。这是通过首先假设膝盖相对于模型将向前弯曲,然后将该方向保存在 IK 姿势中的脚的旋转中来设置的。例如,如果脚在 IK 姿势中指向外侧,这意味着脚的内侧边缘更朝前,因此膝盖会向脚的内侧边缘弯曲。相反,如果脚在 IK 姿势中更向内侧,脚的外侧边缘更朝前(相对于模型的正前方),因此膝盖会倾向于向脚的外侧边缘弯曲。 -In short: if you want your knees to bend more inward, rotate your feet outward in IK Pose. If you want your knees to bend more outward, rotate your feet inward in IK pose. +简而言之:如果您希望膝盖向内侧弯曲更多,请在 IK 姿势中将脚向外旋转。如果您希望膝盖向外侧弯曲更多,请在IK姿势中将脚向内旋转。 + -### Sitting Pose -The controller used in this slot is used for both animation and posing. When you sit, the viewpoint of your avatar is used for calibration. The animation is played, allowing you to create a "sitting down" animation, as well as a "sitting" idle animation. +### Sitting Pose (坐姿) +此控制器既用于固定动画,也用于您模型的特点姿势。当您坐下时,将使用您模型的 iewpoint 进行校准。播放动画,使您可以创建“坐下”动画以及“坐着”的空闲动画。 -If you want to make your own, fair warning: this can take some significant tweaking to get right! You may want to employ transition states for sitting down/standing up that will help a bit with how your avatar looks while sitting. \ No newline at end of file +如果您想要自己制作,需要注意:您需要大量的调整才能做到这一点!您可能需要使用一些过渡状态来改进您的模型在坐下时的外观。 \ No newline at end of file diff --git a/docs/creators.vrchat.com/avatars/state-behaviors.md b/docs/creators.vrchat.com/avatars/state-behaviors.md index 37204d9..1433a41 100644 --- a/docs/creators.vrchat.com/avatars/state-behaviors.md +++ b/docs/creators.vrchat.com/avatars/state-behaviors.md @@ -1,181 +1,182 @@ ---- -title: "State Behaviors" ---- +# State Behaviors (动画状态行为) + +::: warning 您需要了解 Unity 动画器 -# State Behaviors - -::: warning Unity Knowledge Required - -This document is written with the assumption that you know a bit about [Unity Animators](https://docs.unity3d.com/2019.4/Documentation/Manual/class-AnimatorController.html). +本文档假设您对[ Unity 动画器](https://docs.unity3d.com/cn/2019.4/Manual/class-AnimatorController.html)有一定了解。 ::: -When you've got a specific state selected in the Animator view, you'll be able to add State Behaviors. They're a bit like components for states. They do different things. Try adding them, and you'll see what they can do! +当您在动画器窗口中选择特定动画状态时,您可以给它添加 State Behavior 。它们类似于"状态的组件",可以执行很多操作。您可以通过添加它们来使用它们的功能! -All state behaviors run on the first frame of the transition into that state. +所有 State Behavior 都在转换到该动画状态的第一帧上运行。 -State behaviors *should* run no matter how long the state machine remains in the state containing the state behavior. + State Behavior *应该*可以在任意运行时间长度的动画状态中的状态机上持续运行。 + ::: warning -The term "should" is deliberately used here, as in the [Unity documentation](https://docs.unity3d.com/2019.4/Documentation/Manual/StateMachineBehaviours.html) does not define any guarantee that state behaviors will execute given very small transition or state durations. +这里故意使用了"应该"这个词,因为在对应的[ Unity 文档](https://docs.unity3d.com/cn/2019.4/Manual/StateMachineBehaviours.html)中,没有任何可以确保 State Behavior 可以在非常短的过渡(或状态持续时间内)执行的办法。 -If you wanted to be **completely** safe, ensure the total time spent in the state containing the state behavior and any transitions directly to that state is a minimum of 0.02 seconds-- although in practice, this doesn't seem to be required. +如果您想要一种**完全**稳定运行的办法,请确保包含 State Behavior 的状态,以及直接过渡到该状态的任何过渡的总时间至少为 0.02 秒,虽然实践证明这一预留时间不是很有必要。 ::: -## Animator Layer Controller +## Animator Layer Controller (动画层控制器) ![Unity_2020-07-08_12-50-04.png](/creators.vrchat.com/images/avatars/state-behaviors-e78eb77-Unity_2020-07-08_12-50-04.png) -The Animator Layer Control allows you to blend the weight of a specific Animator Layer inside any given Playable Layer over any given time. - -If the state is exited mid-blend duration, the target layer is immediately set to the goal weight. +Animator Layer Controller 允许您在任何给定的 (Playable Layer)[/creators.vrchat.com/avatars/playable-layers.md] 上在任何给定的时间内指定特定动画层的权重。 + +如果状态在未过渡到指定权重时退出,那么目标层将立即设置为目标权重。 -The layer weight will remain until some other state runs this State Behavior again and resets it. +运行结束后,被操作的目标层权重将保持不变,直到其他状态再次运行此 State Behavior 并重置它。 -| Property Name | Purpose | +| 属性名称 | 目的 | | -------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | -| Playable | Allows you to select which Playable Layer you're affecting. | -| Layer | The Index of the Playable Layer you wish to affect. You can't change the weight of the 0th (base) layer-- it is always set to 1.0 weight. | -| Goal Weight | Define the weight you want to blend to. | -| Blend Duration | Define the time period (in seconds) that you want the blend to take. 0 means instant. | -| Debug String | When this StateBehavior runs, this string will be printed to the output log. Useful for debugging. | +| Playable (可播放层) | 允许您选择要影响的可播放层。 | +| Layer (层) | 您希望影响的可播放层的层数值。您无法更改第 0 个(基础)层的权重--因为其权重值始终保持为 1.0。 | +| Goal Weight (目标权重) | 定义您要过渡到的权重。 | +| Blend Duration (混合持续时间) | 定义过渡所需的时间段(以秒为单位)。0 表示即时。 | +| Debug String (调试字符串) | 当此 State Behavior 在运行时,此字符串将打印到输出日志中。用于调试。 | + + - -## Animator Locomotion Control +## Animator Locomotion Control (动画器移动控制器) ![state-behaviors-f6f3250-Unity_2020-07-08_13-16-13.png](/creators.vrchat.com/images/avatars/state-behaviors-f6f3250-Unity_2020-07-08_13-16-13.png) -The Animator Locomotion Control allows you to disable locomotion in a given state of an animator. The Locomotion state will remain until some other state runs this State Behavior again and changes it. +Animator Locomotion Control 允许您在动画器的给定状态中禁用移动。之前的移动状态将保持不变,直到其他状态再次运行此 State Behavior 并更改它。 -In Desktop mode, this disables translational movement, and restricts rotational (view) movement to the vertical axis. In VR, this disables translational and rotational controller movement and restricts half-body IK (full-body IK is unaffected). In both modes, the player's capsule is frozen in place. +在桌面模式下,这将禁用平移运动,并将旋转(视角)运动限制在纵向轴上。在 VR 中,这将禁用手柄上的平移和旋转运动,并限制半身 IK(全身 IK 不受影响)。在这两种模式下,玩家的胶囊体将被冻结在原地。 -| Parameter | Description | +| 参数 | 描述 | | ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Disable Locomotion | If set to True, locomotion (moving with the controls) will be disabled. Roomscale movement will still be possible. If set to False, will enable locomotion. | -| Debug String | When this StateBehavior runs, this string will be printed to the output log. Useful for debugging. | +| Disable Locomotion(禁用运动) | 如果设置为 True ,则禁用您使用以上输入设备进行运动的能力,但您仍然可以在 VR 中通过在房间中走动来运动您的模型。如果设置为 False,则启用运动。 | +| Debug String(调试字符串) | 当此 State Behavior 运行时,此字符串将打印到输出日志中。用于调试。 | -## Animator Temporary Pose Space + +## Animator Temporary Pose Space (动画器临时姿势空间) ![state-behaviors-467daaf-Unity_2020-07-14_21-38-14.png](/creators.vrchat.com/images/avatars/state-behaviors-467daaf-Unity_2020-07-14_21-38-14.png) -The Animator Temporary Pose Space control allows you to move the viewpoint of the person wearing the avatar to the head at that given point of the animator state. +Animator Temporary Pose Space 允许您将您当前使用的模型的头部视角球移动到该动画状态的给定点位置。 -The view will remain set until some other state runs this State Behavior again and resets or clears it. +视角球移动后的位置将保持不变,直到其他状态再次运行此 State Behavior 并重置或清除它。 -This behavior is executed when the delay time has elapsed. +此行为在延迟时间到达后执行。 -Animator Temporary Pose Space should **only** be used when the view height needs to update due to a posture change, like sitting or laying on the ground. It cannot be used to "scale" the avatar being worn, and will cause major breaking problems if used in this manner. +您应**仅在**视图高度需因姿势变化(如坐下或躺在地上)而更新时,才使用 Animator Temporary Pose Space。它不能用于"缩放"您当前使用的模型,并且如果您尝试以这种方式"缩放"模型,那么将导致严重的问题。 ::: danger -This state behavior **will not execute** if the state this behavior is on is exited or interrupted before `Delay Time` elapses! +如果在此行为所在的状态退出或中断之后,`延迟时间`才结束,那么此 State Behavior **不会执行**! ::: -| Property Name | Purpose | +| 属性名称 | 目的 | | ------------- | --------------------------------------------------------------------------------------------------------------------------- | -| Pose Space | Enter or exit. Enter sets the pose space, exit will clear it to default. | -| Fixed Delay | Should the delay time be a fixed period of time, or a percentage of the state's duration? | -| Delay Time | If given a value, the viewpoint will be set after a delay. Useful if you're blending into an animation over a certain time. | -| Debug String | When this StateBehavior runs, this string will be printed to the output log. Useful for debugging. | +| Pose Space(姿势空间) | 从 Enter 或 exit 选择一个选项。Enter 将设置视角球位置,exit 将视角球位置清除为默认值。 | +| Fixed Delay(固定延迟 ) | 延迟时间是否为固定时间段,还是状态持续时间的百分比? | +| Delay Time(延迟时间) | 如果给定一个值,视角球位置将在该值对应的延迟时间后设置。您可以使用这个设置,例如您要在一定时间后再设置到动画中时。 | +| Debug String(调试字符串) | 当此 State Behavior 运行时,此字符串将打印到输出日志中。用于调试。 | -## Animator Tracking Control +## Animator Tracking Control (动画器追踪控制器) ![state-behaviors-076baca-Unity_2020-07-08_13-26-00.png](/creators.vrchat.com/images/avatars/state-behaviors-076baca-Unity_2020-07-08_13-26-00.png) -The Animator Tracking Control allows you to enable or disable IK or simulated movement on various different parts of the avatar body. Setting the option to "No Change" will not change the body part from its current value. "Tracking" will set it to following IK or simulated movement. "Animation" will force that body part to respect values as given by the avatar's Animator. +Animator Tracking Control 允许您在动画角色身体的各个部位上启用或禁用 IK 或模拟运动。将选项设置为"No Change"将不会更改该身体部位的当前追踪控制模式。"Tracking" 将该身体部位设置为跟随 IK 或模拟运动。"Animation" 将该身体部位设置为跟随动画运动。 -If you set all IK tracking points to Animation, your animation will play as the Animation remotely, instead of being translated through Networked IK. For the various types of tracking, these "IK tracking points" are: +如果将所有 IK 追踪点设置为跟随动画运动,则您的对应部位运动将作为动画在远端播放,而不是通过网络同步的 IK 来表现。对于各种类型的 IK 追踪,这些" IK 追踪点"是: -- Desktop: Head, Left Hand, Right Hand -- 3pt Tracking: Head, Left Hand, Right Hand -- 6pt / FBT Tracking: Head, Left Hand, Right Hand, Hip, Left Foot, Right Foot +- 桌面:头部、左手、右手 +- 3点追踪:头部、左手、右手 +- 6点/全身追踪:头部、左手、右手、臀部、左脚、右脚 ::: tip -All parts are IK-driven, aside from the Eyes and Eyelid, which are simulated. Mouth and Jaw are driven by visemes. +除了眼睛和眼睑之外,所有部位都是由 IK 驱动的,眼睛和眼睑是模拟的。嘴巴和下颌由面部表情驱动。 -As an example, setting Left and Right Hand to Animation will ignore the position of the hands (and arms) as defined by IK, and will instead use any currently-active state's motion to define the position of the hands and arms. Setting them back to Tracking will use IK instead. +例如,将左手和右手设置为 Animation 将忽略由 IK 定义的手(和手臂)的位置,并将使用当前的动画状态的运动来定义手和手臂的位置。将它们设置回 Tracking 将重新使用 IK 定义的位置。 -Setting Eyes & Eyelid to Animation will disable eye movement and eyelid blinking. Setting Eyes & Eyelid to Tracking will re-enable the simulated eye movement and blinking. +将眼睛和眼睑设置为 Animation 将禁用眼睛运动和眼睑眨动。将眼睛和眼睑设置为 Tracking 将重新启用模拟的眼睛运动和眨眼。 -Setting Mouth and Jaw to Animation will disable visemes, and viseme parameters will stop being updated. Setting Mouth and Jaw will re-enable visemes and they will start updating again. +将嘴巴和下颌设置为 Animation 将禁用面部表情,面部表情参数将停止更新。将嘴巴和下颌设置为 Tracking 将重新启用面部表情,面部表情参数将重新开始更新。 ::: -The Tracking setting will be kept until some other state runs this State Behavior again and resets it. +追踪设置将保持不变,直到其他状态再次运行此 State Behavior 并重置它。 -| Parameter | Description | +| 参数 | 描述 | | :--------------- | :-------------------------------------------------------------------------------------------------- | -| Tracking Control | See description above. | -| Debug String | When this State Behavior runs, this string will be printed to the output log. Useful for debugging. | +| Tracking Control(追踪控制) | 请参阅上面的描述。 | +| Debug String(调试字符串) | 当此 State Behavior 运行时,此字符串将打印到输出日志中。用于调试。 | -## Avatar Parameter Driver +## Avatar Parameter Driver (模型参数驱动器) ![image](/creators.vrchat.com/images/avatars/state-behaviors-fa19a1d-2022-06-02_18-11-06_Unity.png) -The Avatar Parameter Driver can manipulate Animator Parameters in a variety of ways. A single Avatar Parameter can perform multiple operations, and they are done in order from top to bottom. These operations are completed *once* upon entry to the State upon which the behavior resides. +Avatar Parameter Driver 可以以各种方式修改动画器参数,也可针对单个模型参数执行多个操作。这些操作将被按从上到下的界面顺序,在进入行为所在的状态时完成*一次*。 -`Local Only` will cause the driver to only operate locally, as a shortcut instead of detecting `isLocal`. +`Local Only`将使该 State Behavior 仅在本地操作,作为检测`isLocal`的快捷方式。 -Clicking "Add" will add a new operation to the Driver. The first type (which is selected by default) is "Set". +单击"Add (添加)"将向该 State Behavior 添加新操作。第一个类型(默认选择)是"Set (设置)"。 -If modifying a synced parameter (anything defined in the VRCExpressionParameters object) those values will be clamped to their maximum range. Int [0,255] Float [-1,1]. +如果修改同步参数(在 VRCExpressionParameters 对象中定义的任何内容),这些值将被限制在其可同步的最大范围内,例如对于 Int 是 [0,255],对于 Float 是[-1,1]。 -However, Parameters only defined in the Animation Controller (aka, "local parameters") can still be modified by a parameter driver. Those values aren't clamped. +但是,仅在动画控制器中定义的参数(即"本地参数")仍然可以由 Avatar Parameter Driver 修改。这些值不会被限制。 -You also cannot drive any of the [VRChat-defined Animator Parameters](/creators.vrchat.com/avatars/animator-parameters). +您也不能在这个 State Behavior 里修改任何[VRChat定义的动画器参数](/creators.vrchat.com/avatars/animator-parameters)。 -Set, Add, Random, and Copy work for `float` and `int`. Set, Random, and Copy work for `bool`. +Set、Add、Random 和 Copy 适用于`float`和`int`。Set、Random 和 Copy 适用于`bool`。 -### Set -Set will simply set the Value to the named Parameter in Destination. +### Set (设置) +Set 将简单地将目标中的命名参数设置到指定值。 ![state-behaviors-121fe2a-2022-06-02_18-11-13_NVIDIA_Share.png](/creators.vrchat.com/images/avatars/state-behaviors-121fe2a-2022-06-02_18-11-13_NVIDIA_Share.png) -### Add -Add will add the Value to the named Parameter in Destination. +### Add (添加) +Add 将给目标中的命名参数添加指定值。 -As the component points out, using Add may not produce the same result when run on a remote instance of the avatar. When using Add, it is suggested to use a synced Destination Parameter and only run the driver locally. +正如该组件指出的,使用 Add 可能在远程实例的动画化模型上运行时产生不同的结果。使用 Add 时,建议使用同步的目标参数,并仅在本地运行该 State Behavior。 ![state-behaviors-e10bb6a-2022-06-02_18-11-17_Unity.png](/creators.vrchat.com/images/avatars/state-behaviors-e10bb6a-2022-06-02_18-11-17_Unity.png) -### Random -Random will set the Destination Parameter to a random number between Min Value and Max Value. +### Random (随机) +Random 将目标参数设置到介于最小值和最大值之间的某一随机数。 -As the component points out, using Random may not produce the same result when run on a remote instance of the avatar. When using Random, it is suggested to use a synced Destination Parameter and only run the driver locally. +正如组件指出的,使用 Random 可能在远程实例的动画化模型上运行时产生不同的结果。使用 Random 时,建议使用同步的目标参数,并仅在本地运行该 State Behavior。 ![state-behaviors-99c6248-2022-06-02_18-11-23_Unity.png](/creators.vrchat.com/images/avatars/state-behaviors-99c6248-2022-06-02_18-11-23_Unity.png) -### Copy -Copy will set the value of the Source Parameter to the Destination Parameter. This can be used to set one float to match another float, to remap one float into a different range, or to convert between two different types entirely. +### Copy (复制) +Copy 将目标参数设置到源参数的值。这可以用于例如将一个浮点数的值传递到另一个浮点数,使它们的数值完全相等,将一个浮点数重新映射到不同的大小范围,或者将某种数转换为其他完全不同的类型。 ::: warning -VRChat's built-in parameters, such as `GestureLeftWeight`, **can** be specified but do not work as source parameters. +VRChat的内置参数,如`GestureLeftWeight`,**可以**指定,但不起作用作为源参数。 ::: ![state-behaviors-bffdb10-2022-06-02_18-11-30_Unity.png](/creators.vrchat.com/images/avatars/state-behaviors-bffdb10-2022-06-02_18-11-30_Unity.png) -#### Converting between types -When converting from a `bool`, False counts as 0 and True counts as 1. +#### Converting between types (类型转换) +从`bool`转换时,False 计为 0,True 计为 1。 -When converting to a `bool`, 0 is False and *anything* else is True. -When converting to an `int`, it will always round *down* to the nearest whole number. -When converting to a `float`, it will directly copy the value, even if it goes outside the range that it is capable of syncing to other players. +转换为`bool`时,0 为 False ,*任何其他值*为 True。 +转换为`int`时,它将始终向下舍入到最近的整数。 +转换为`float`时,它将直接复制值,即使这个值超出了它能够同步给其他玩家的最大范围。 -#### Custom Ranges -You can also use the `Convert Range` checkbox to enable some additional UI that allows you to set custom conversion ranges. This can be used to remap values or to have more control over exactly how it converts from one type to another type. +#### Custom Ranges (自定义范围) +您还可以使用`Custom Ranges`复选框来启用一些额外的 UI,以便您可以设置自定义转换范围。这可以用于重新映射值或更好地控制从一种类型转换为另一种类型的方式。 ![state-behaviors-cab639b-2022-06-02_18-35-32_Unity.png](/creators.vrchat.com/images/avatars/state-behaviors-cab639b-2022-06-02_18-35-32_Unity.png) -## Playable Layer Control +## Playable Layer Control (可播放层控制器) ![state-behaviors-33760a2-Unity_2020-07-08_13-36-13.png](/creators.vrchat.com/images/avatars/state-behaviors-33760a2-Unity_2020-07-08_13-36-13.png) -The Playable Layer Control allows you to blend the weight of the entire Playable Layer to a specified value over specified duration. Very similar to Animator Layer Control, but instead controls the entire Playable Layer. +Playable Layer Control 允许您在指定的时间内将整个可播放层的权重过渡到指定的值。它与 Animator Layer Controller 非常相似,但是前者控制整个可播放层。 + +Action 可播放层通常会使用该 State Behavior ,因为 Action 层默认情况下权重为零,并且在动画完成后,它的权重应始终过渡回零。 -The Action Playable layer will use this State Behavior often, as the Action layer has weight zero by default, and should always be blended back to zero after the animation is complete. +如果在过渡持续时间中退出状态,目标可播放层将立即设置为目标权重。 -If the state is exited mid-blend duration, the playable layer is immediately set to the goal weight. +| 属性名称 | 作用 | +| -------------- | -----------------------------------------------------------| +| Layer(层) | 要影响的目标可播放层。 | +| Goal Weight(目标权重) | 目标可播放层过渡完成后要达到的权重。 | +| Blend Duration(混合持续时间) | 过渡到目标权重所需的时间。零表示即时。 | +| Debug String(调试字符串) | 当此 State Behavior 运行时,此字符串将打印到输出日志中。用于调试。 | -| Property Name | Purpose | -| -------------- | -------------------------------------------------------------------------------------------------- | -| Layer | The Playable Layer to affect. | -| Goal Weight | The Playable layer weight to target after blending is complete. | -| Blend Duration | The amount of time to take to blend to the layer. Zero is instant. | -| Debug String | When this StateBehavior runs, this string will be printed to the output log. Useful for debugging. | \ No newline at end of file + \ No newline at end of file diff --git a/docs/creators.vrchat.com/avatars/whitelisted-avatar-components.md b/docs/creators.vrchat.com/avatars/whitelisted-avatar-components.md index 8fadf5d..768e608 100644 --- a/docs/creators.vrchat.com/avatars/whitelisted-avatar-components.md +++ b/docs/creators.vrchat.com/avatars/whitelisted-avatar-components.md @@ -1,15 +1,17 @@ ---- -title: "Allowed Avatar Components" ---- -# Allowed Avatar Components +# 白名单模型组件 -Here is a list of the components permitted on avatars. Any component not on this list will be removed at runtime, and may prevent upload. +以下是允许在模型上使用的组件列表。任何不在此列表中的组件都将在上传时被删除。 -Custom scripts/components are not permitted on avatars, and will be removed at upload and runtime. +::: info 如果您使用过时的 VRChat SDK +当您使用版本低于 3.3.0 的 SDK 时,不在列表中的组件也会在编辑器的播放模式中被删除 +::: + + +自定义脚本或组件同样会在上传和运行时被删除,您不能在游戏中时,在模型中使用它们。 ::: warning Oculus Quest -The Quest version of VRChat has some exceptions to this list. Check [here](/creators.vrchat.com/platforms/android/quest-content-limitations#components) for more info. +VRChat 的 Quest 版本在此列表的基础上减少了一些组件,这些组件因故无法在 Quest 版本中使用。您可在[这里](/creators.vrchat.com/platforms/android/quest-content-limitations#组件)查看更多信息。 ::: ## VRChat @@ -18,57 +20,58 @@ The Quest version of VRChat has some exceptions to this list. Check [here](/crea - [VRCStation](/creators.vrchat.com/worlds/components/vrc_station) - [VRCPhysBone](/creators.vrchat.com/avatars/avatar-dynamics/physbones#vrcphysbone) - [VRCPhysBoneCollider](/creators.vrchat.com/avatars/avatar-dynamics/physbones#vrcphysbonecollider) -- [VRCContactSender](/creators.vrchat.com/avatars/avatar-dynamics/contacts#vrccontactsender) -- [VRCContactReceiver](/creators.vrchat.com/avatars/avatar-dynamics/contacts#VRCContactReceiver) +- [VRCContactSender](/creators.vrchat.com/avatars/avatar-dynamics/contacts#发送端:VRCContactSender) +- [VRCContactReceiver](/creators.vrchat.com/avatars/avatar-dynamics/contacts#接收端:VRCContactReceiver) - [VRCSpatialAudioSource](/creators.vrchat.com/worlds/components/vrc_spatialaudiosource#spatial-audio-on-avatars) -- [*VRC_IKFollower*](https://docs.vrchat.com/docs/vrc_ikfollower) - Deprecated! You should use Constraints instead. - +- *VRC_IKFollower* - 此组件已废弃!您应改用约束来替代它。 + ## Unity -- [Transform](https://docs.unity3d.com/2019.4/Documentation/Manual/class-Transform.html) -- [Animator](https://docs.unity3d.com/2019.4/Documentation/Manual/class-Animator.html) -- [SkinnedMeshRenderer](https://docs.unity3d.com/2019.4/Documentation/Manual/class-SkinnedMeshRenderer.html) -- [MeshFilter](https://docs.unity3d.com/2019.4/Documentation/Manual/class-MeshFilter.html) -- [MeshRenderer](https://docs.unity3d.com/2019.4/Documentation/Manual/class-MeshRenderer.html) -- [Animation](https://docs.unity3d.com/2019.4/Documentation/Manual/class-Animation.html) -- [ParticleSystem](https://docs.unity3d.com/2019.4/Documentation/Manual/class-ParticleSystem.html) -- [ParticleSystemRenderer](https://docs.unity3d.com/2019.4/Documentation/Manual/PartSysRendererModule.html) -- [TrailRenderer](https://docs.unity3d.com/2019.4/Documentation/Manual/class-TrailRenderer.html) -- [LineRenderer](https://docs.unity3d.com/2019.4/Documentation/Manual/class-LineRenderer.html) -- [Cloth](https://docs.unity3d.com/2019.4/Documentation/Manual/class-Cloth.html) -- [Light](https://docs.unity3d.com/2019.4/Documentation/Manual/class-Light.html) -- [Collider](https://docs.unity3d.com/2019.4/Documentation/Manual/CollidersOverview.html) -- [Rigidbody](https://docs.unity3d.com/2019.4/Documentation/Manual/class-Rigidbody.html) -- [Joints](https://docs.unity3d.com/2019.4/Documentation/Manual/Joints.html) -- [Camera](https://docs.unity3d.com/2019.4/Documentation/Manual/class-Camera.html) - - For avatars worn by the local user, Camera components are fully whitelisted. - - For avatars worn by remote users, the following rules apply: - - In all cases, the Camera components of remote users are disabled when the avatar is loaded. - - You can use animations to enable Camera components. - - If the local user and remote user are friends, Camera components are not removed. - - Note that becoming friends with a user does not automatically reload their avatar. - - If the local user has selected "Show Avatar" for the remote user in VRChat's quick menu, Camera components are not removed. - - If neither of the above is true, Camera components are removed and cannot be enabled. - -- [FlareLayer](https://docs.unity3d.com/2019.4/Documentation/Manual/class-FlareLayer.html) -- [AudioSource](https://docs.unity3d.com/2019.4/Documentation/Manual/class-AudioSource.html) -- [AimConstraint](https://docs.unity3d.com/2019.4/Documentation/Manual/class-AimConstraint.html) -- [LookAtConstraint](https://docs.unity3d.com/2019.4/Documentation/Manual/class-LookAtConstraint.html) -- [ParentConstraint](https://docs.unity3d.com/2019.4/Documentation/Manual/class-ParentConstraint.html) -- [PositionConstraint](https://docs.unity3d.com/2019.4/Documentation/Manual/class-PositionConstraint.html) -- [RotationConstraint](https://docs.unity3d.com/2019.4/Documentation/Manual/class-RotationConstraint.html) -- [ScaleConstraint](https://docs.unity3d.com/2019.4/Documentation/Manual/class-ScaleConstraint.html) - - For the wearer and their friends, camera components are disabled on load. Use an animation to enable the component. For non-friends of the wearer, camera components are removed completely on load. - -## [Root Motion (FinalIK)](http://www.root-motion.com/finalikdox/html/index.html) -::: warning FinalIK Components Modified - -VRChat has highly modified its implementation of FinalIK. As such, these components may not work as documented. - -We do not directly support or test custom FinalIK implementations on avatars. However, they *should* work fine, and if we must intentionally break one or more of these, we will try our best to inform creators. - -If you discover a bug, please [let us know](https://feedback.vrchat.com). +- [Transform](https://docs.unity3d.com/cn/2019.4/Manual/class-Transform.html) +- [Animator](https://docs.unity3d.com/cn/2019.4/Manual/class-Animator.html) +- [SkinnedMeshRenderer](https://docs.unity3d.com/cn/2019.4/Manual/class-SkinnedMeshRenderer.html) +- [MeshFilter](https://docs.unity3d.com/cn/2019.4/Manual/class-MeshFilter.html) +- [MeshRenderer](https://docs.unity3d.com/cn/2019.4/Manual/class-MeshRenderer.html) +- [Animation](https://docs.unity3d.com/cn/2019.4/Manual/class-Animation.html) +- [ParticleSystem](https://docs.unity3d.com/cn/2019.4/Manual/class-ParticleSystem.html) +- [ParticleSystemRenderer](https://docs.unity3d.com/cn/2019.4/Manual/PartSysRendererModule.html) +- [TrailRenderer](https://docs.unity3d.com/cn/2019.4/Manual/class-TrailRenderer.html) +- [LineRenderer](https://docs.unity3d.com/cn/2019.4/Manual/class-LineRenderer.html) +- [Cloth](https://docs.unity3d.com/cn/2019.4/Manual/class-Cloth.html) +- [Light](https://docs.unity3d.com/cn/2019.4/Manual/class-Light.html) +- [Collider](https://docs.unity3d.com/cn/2019.4/Manual/CollidersOverview.html) +- [Rigidbody](https://docs.unity3d.com/cn/2019.4/Manual/class-Rigidbody.html) +- [Joints](https://docs.unity3d.com/cn/2019.4/Manual/Joints.html) +- [Camera](https://docs.unity3d.com/cn/2019.4/Manual/class-Camera.html) + - 对于本地玩家使用的模型,相机组件不受任何限制。 + - 对于远端玩家使用的模型,适用以下限制: + - 在所有情况下,当加载模型时,远端玩家的相机组件将被禁用。 + - 上条中的相机组件可以被动画重新启用。 + - 如果本地玩家和远端玩家是好友,则不会删除相机组件。 + - 如果两者刚成为好友,则需要手动重载远端玩家模型来启用相机组件。 + - 如果本地玩家在 VRChat 的快捷菜单中为远端玩家选择了"显示模型",则不会删除相机组件。 + - 如果不满足以上任一情况,则删除相机组件,且它们无法被重新启用。 + +- [FlareLayer](https://docs.unity3d.com/cn/2019.4/Manual/class-FlareLayer.html) +- [AudioSource](https://docs.unity3d.com/cn/2019.4/Manual/class-AudioSource.html) +- [AimConstraint](https://docs.unity3d.com/cn/2019.4/Manual/class-AimConstraint.html) +- [LookAtConstraint](https://docs.unity3d.com/cn/2019.4/Manual/class-LookAtConstraint.html) +- [ParentConstraint](https://docs.unity3d.com/cn/2019.4/Manual/class-ParentConstraint.html) +- [PositionConstraint](https://docs.unity3d.com/cn/2019.4/Manual/class-PositionConstraint.html) +- [RotationConstraint](https://docs.unity3d.com/cn/2019.4/Manual/class-RotationConstraint.html) +- [ScaleConstraint](https://docs.unity3d.com/cn/2019.4/Manual/class-ScaleConstraint.html) + + + + +## [Root Motion(FinalIK)](http://www.root-motion.com/finalikdox/html/index.html) +::: warning FinalIK组件修改 + +VRChat 对 FinalIK 的实现进行了高度修改。因此,这些组件的功能可能和源文档中描述的不同。 + +在模型上,我们不会官方维护,或测试自定义的 FinalIK 实现。即使如此,这些实现也*应该*能正常工作,如果我们因故对这些组件做出破坏性更改,我们将尽力通知创作者。 + +如果您发现错误,请[告诉我们](https://feedback.vrchat.com)。 ::: - [Aim IK](http://www.root-motion.com/finalikdox/html/page1.html) - [Biped IK](http://www.root-motion.com/finalikdox/html/page4.html) @@ -82,12 +85,12 @@ If you discover a bug, please [let us know](https://feedback.vrchat.com). - Twist Relaxer - Shoulder Rotator - Using this script on a humanoid avatar will break it. + 在人形模型上使用此脚本将导致模型无法正常使用。 ## [DynamicBone](https://assetstore.unity.com/packages/tools/animation/dynamic-bone-16743) -::: danger Dynamic Bone Deprecated +::: danger Dynamic Bone 已弃用 -Support for Dynamic Bone is deprecated. You should use [PhysBones](/creators.vrchat.com/avatars/avatar-dynamics/physbones) instead. +我们已不再官方支持 Dynamic Bone。您应该转而使用[PhysBones](/creators.vrchat.com/avatars/avatar-dynamics/physbones)。 ::: diff --git a/docs/docs.vrchat.com/index.md b/docs/docs.vrchat.com/index.md index e50b688..c43cde6 100644 --- a/docs/docs.vrchat.com/index.md +++ b/docs/docs.vrchat.com/index.md @@ -2,7 +2,7 @@ # VRChat 帮助文档 -欢迎来到VRChat 文档枢纽。您将找到全面的指南和文档,以帮助您尽快游玩 VRChat,并在遇到困难时为您提供支持。让我们直接开始吧! +欢迎来到VRChat 帮助文档。您将找到全面的指南和文档,以帮助您尽快游玩 VRChat,并在遇到困难时为您提供支持。让我们直接开始吧! diff --git a/docs/index.md b/docs/index.md index daf7cf6..de171f6 100644 --- a/docs/index.md +++ b/docs/index.md @@ -4,7 +4,7 @@ layout: home # hero: # actions: # - theme: brand -# text: VRChat 文档枢纽 +# text: VRChat 帮助文档 # link: docs.vrchat.com/index # - theme: brand # text: VRChat 创作者文档