VRC Station
允许用户通过与物体交互来坐下。在 SDK 中可以在 VRCChair3 找到一个示例。
此组件也可以用于虚拟形象上,在虚拟形象上创建座位!
参数和选项
| 参数 | 描述 |
|---|---|
| Player Mobility | 玩家能否移动,选项包括: |
| - Mobile:允许用户在座位上移动。 | |
| - Immobilize:阻止用户移动。 | |
| - Immobilize For Vehicle:与 Immobilized 相同,但针对移动中的座位进行了优化。 | |
| Can Use Station From Station | 用户是否可以在座位中切换座位。 |
| Animation Controller(可选) | 用于用自定义动画覆盖正常的座位动画。 |
| Disable Station Exit | 用户是否不能通过常规方式退出座位,使用触发器将用户从座位上移开。 |
| Seated | 这是一个用户应该坐下的座位吗?详见上方描述。 |
| Station Enter Player Location | 定义用户坐下时应被传送到哪里的变换。 |
| Station Exit Player Location | 定义用户被移出座位时应被传送到哪里的变换。 |
| Controls Object | 用于可以控制对象的座位,例如车辆。 |
使用 Udon 创建座位
你可以在自己的自定义 Udon 脚本中使用座位。制作一个座椅相当简单。VRCSDK 中包含的 VRCChair3 预制件展示了如何设置。
一个椅子只需要一个带有以下组件的游戏对象:
VRC_Station,其入口和出口点设置为自身或另一个变换,用于指定玩家在座位上的固定位置。- 一个碰撞器,通常启用"Is Trigger"。
- 一个带有处理坐下的 Udon 程序的 UdonBehaviour。
- (可选)一个看起来像椅子的网格。
VRChat SDK 附带了一个处理第 3 步的程序,称为 StationGraph。
- Udon Graph
- UdonSharp

using UdonSharp;
using UnityEngine;
using VRC.SDKBase;
public class StationGraph : UdonSharpBehaviour
{
public override void Interact()
{
Networking.LocalPlayer.UseAttachedStation();
}
public override void OnStationEntered(VRCPlayerApi player)
{
Debug.Log($"{player.displayName} 进入了座位");
}
public override void OnStationExited(VRCPlayerApi player)
{
Debug.Log($"{player.displayName} 离开了座位");
}
}
Udon 的"OnStationEntered"和"OnStationExited"事件对于高级用例非常有用,例如检测哪个玩家进入或离开了移动车辆。
在世界中使用座位
你的 Animator 可以访问虚拟形象参数,以对虚拟形象进入座位做出反应。
- 使用
InStation参数检测虚拟形象是否已进入座位,但可能没有启用 Seated-IK。 - 使用
Seated参数检测座位中的虚拟形象是否启用了 Seated-IK。- 仅当座位上的
Seated属性启用时,才使用Seated参数。
- 仅当座位上的
检测 SDK2 虚拟形象
座位对于使用非常旧版本的 VRChat SDK(SDK2)上传的虚拟形象会有不同的表现。
检查 AvatarVersion 参数以检测 SDK2 虚拟形象。例如:
- 如果
AvatarVersion是3,则虚拟形象使用现代 SDK3。 - 如果
AvatarVersion小于3,则虚拟形象使用过时的 SDK2。
使用 AvatarVersion 和 InStation 来转换到不同的自定义座位动画。差异如下所述。
SDK2 虚拟形象
如果 SDK2 虚拟形象使用你的座位,你的 Animator 应应用固定的坐姿(如果 Seated 启用),或者如果 Seated 未启用,则应用全身动画。
SDK3 虚拟形象
如果 SDK3 虚拟形象使用你的座位,你的 Animator 可以选择应用 SDK3 虚拟形象可用的任何动画组合、追踪控制更改和姿势空间更改。但是,不会有幕后的状态行为应用(这在 SDK2 座位中确实会发生)。
请注意,由于创作者决定应用哪种类型的追踪控制,座位上的 Seated 属性不一定表示 SDK3 虚拟形象上的追踪类型。
我们的示例座位控制器展示了这种分支行为以及应用座位动画的正确过渡和状态行为设置。
座位只能影响虚拟形象上已存在的参数。你不能使用状态行为创建新参数。
在虚拟形象上使用座位
SDK 中包含的默认 VRCChair 预制件可以用于虚拟形象上,让其他玩家"坐"在你身上。你可以利用它把你的虚拟形象变成一辆车、一张可以移动的餐桌等等!一个虚拟形象最多可以有 6 个座位。
当在想要通过动画打开或关闭的虚拟形象上使用座位时,你需要切换特定的对象和组件。

红色框(上方截图中)在上传时必须启用。如果在上传时禁用,座位将无法工作!
切换红色框将移除当前坐在座位中的任何玩家。切换绿色框只会阻止新玩家坐在座位中。由于这涉及禁用/启用组件和对象,这必须在 FX 层中完成。
请记住,用户可以使用安全系统禁用动画。如果虚拟形象座位默认开启(即默认开启切换),即使穿戴者使用了关闭它们的动画,座位仍然保持活动状态。
上传时还有两个其他限制:
- 入口和出口点之间的距离不得超过 2 米。
- 虚拟形象上最多可以有 6 个座位。超过的数量将被禁用。
参数和选项
| 参数 | 描述 |
|---|---|
| Player Mobility | 玩家在使用座位时是否可以走动。 |
| - Mobile:允许玩家在座位上移动。 | |
| - Immobilize:阻止用户移动并将其移动到"Station Enter Location"。 | |
| - Immobilize For Vehicle:与"Immobilize"相同,但针对移动中的座位进行了优化。 | |
| Can Use Station From Station | 玩家是否可以在座位中切换座位。 |
| Animation Controller(可选) | 覆盖虚拟形象控制器中的"Sitting"可播放层。 |
| Disable Station Exit | 阻止玩家通过移动或跳跃退出座位。 使用 ExitStation 节点将玩家从座位中移除。 |
| Seated | 玩家的虚拟形象在使用座位时是坐着还是站着。 这会影响虚拟形象可播放层的"Seated"参数。 |
| Station Enter Player Location | 玩家进入座位时被移动到此变换组件的位置。 |
| Station Exit Player Location | 玩家退出座位时被移动到此变换组件的位置。 |
限制
虚拟形象必须满足以下要求才能使用座位:
- 虚拟形象必须具有Animator 组件并分配了Unity Avatar。这通常对于人形虚拟形象是自动分配的。
- Animator 组件必须与虚拟形象描述符组件位于同一个游戏对象上。