跳转到内容

32. 空间、比例和舒适

约 35 分钟 难度:新手 动手章

第 31 章把「第一帧看见什么」做对了。玩家走第一步之后,下一个决定他要不要留下来的因素是身体的尺度感:门会不会撞头、走廊会不会肩膀刮到墙、椅子的高度合不合适、楼梯踩起来会不会晕。

这些数字在 PC 桌面端不那么敏感(视角是相机,相机不会撞头)。一旦换到 VR,玩家自己的身体就在场景里。门低 10 厘米,VR 玩家需要弯腰;走廊窄 30 厘米,VR 玩家会下意识缩肩膀。空间的「舒适」是非常具体的几个数字。

这一章把这几个数字摆出来。

VRChat 玩家的「身高」由几件事决定:

  1. Avatar 模型本身的身高。模型骨架决定头顶在哪。
  2. 玩家自己设置的视高(Eye Height)。VRChat 客户端里玩家可以校准自己 VR 头显的真实视高。
  3. 运行时缩放。VRChat 的 Avatar Scaling 系统按「视高(米)」工作,不是缩放倍率:玩家自助菜单(Quick Menu → Avatar Scaling)默认能把视高调到 0.2 米到 5.0 米之间;Udon 通过 SetAvatarEyeHeightMinimumByMeters / MaximumByMeters 等 API 可以调整这个范围,但官方文档要求最小值不能低于 0.2 米、最大值不能高于 5 米。视高直接由头显在场景里的物理高度决定,不需要换算成倍率。

世界搭建时常用的参考数:

参考数值说明
默认 Avatar 视高1.60一个常见 anime / human avatar 的眼高,大约成年人均高
Avatar 头顶到地面1.701.80视高 + 头顶到眼的差
Spawn Y 设到 0 时玩家眼睛~1.60 米高见上
Avatar 体宽0.50.6走廊估算的下限参考
Avatar 步长0.50.7楼梯踏步深度参考

Avatar 千变万化,这些数只是「假设玩家用一个普通人形 avatar」时的中位数。做尺度时按这个中位数走,再给上下两端各留一点余地。

门高、走廊、天花板:三个底线数字

Section titled “门高、走廊、天花板:三个底线数字”

把这三件事按 VRChat 里能用的最小可接受数字列出来:

元素安全下限推荐值说明
门洞高度2.02.22.4现实住宅门约 2.0 米,公共建筑 2.1+;VR 里给玩家留头顶空隙
走廊宽度1.01.51.81 米够 1 个 avatar 通过,但 VR 玩家会感到压迫;社交世界至少 1.5 米
天花板高度2.43.0 米以上室内场景;VR 玩家头顶有 0.5 米余量才不感到压顶

这些是「不让 VR 玩家本能不舒服」的下限,不是「最优体验」。如果世界主打安静聊天的咖啡厅,天花板可以低一点(现实的咖啡厅常 2.6 米),但要换来更好的灯光和氛围。如果世界要承载活动、聚会、舞台,天花板和走廊要再宽到 5 米以上才不挤。

打开自己的世界,在 Hierarchy 里建一个空 GameObject 当临时尺子:

  1. Create Empty 命名 _Ruler_Player
  2. 加一个子 Cube:Position 0, 0.8, 0、Scale 0.5, 1.6, 0.3,颜色用一个明显的洋红材质。
  3. 这个 1.6 米高的「人形」可以拖到场景任意位置当尺子。

走到自己造的门口,把人形拖过去,看头顶有没有撞到门楣。看走廊时把人形多复制几个,模拟两人迎面通过。这一步做完,多数尺度问题在编辑器里就被发现了,不用每次都 Build & Test 再进 VR 验证。

楼梯和坡道:VR 里最容易翻车的细节

Section titled “楼梯和坡道:VR 里最容易翻车的细节”

楼梯是 VR 玩家晕动症的高发区。两个原因:

  1. 视觉抖动。VRChat 玩家走楼梯时镜头会按台阶高度上下跳。在 VR 里这个跳动会被身体当成「自己被颠了一下」。
  2. 碰撞不连续。如果楼梯踏面之间有缝隙、踢面(垂直部分)有 Collider 但踏面没有,玩家会被卡住或掉进缝里。

实务做法不是真做出每一级台阶,是用一段平滑斜坡当楼梯的 Collider 层

StairsVisual (玩家看到的、有踏面踢面的真楼梯模型)
└─ Mesh Renderer (开)
└─ Mesh Collider (关;或者干脆没有 Collider)
StairsRamp (玩家踩的、看不见的斜坡)
└─ Mesh Renderer (关;只留 Collider 层)
└─ Mesh Collider (开)

视觉是楼梯,碰撞是斜坡。玩家走过去的时候 Character Controller 顺着斜坡平滑上升,眼睛看到楼梯。这是 VRChat 世界从早期开始就一直在用的标准做法,社区里大部分能流畅走的楼梯背后都是一段斜坡。

斜坡角度的安全范围:

坡度角度适合
缓坡15° 以下大堂、展厅、商场
普通坡15°30°住宅楼梯、室外坡道
陡坡30°45°工业楼梯、维修通道,VR 里偏陡,会有被推上去的感觉
危险坡45° 以上VR 玩家普遍会感到不舒服,多数情况下应该改用电梯或传送

VRChat Player Controller 默认能爬 45° 以下的斜面。超过 45° 玩家会被卡住。Cube 默认是不带斜面 Collider 的,要做斜坡用一个 Cube 然后 Rotation X 设成 -15° 这样旋转出来;做更复杂的形状用 ProBuilder 或导入 fbx。

晕动症(motion sickness,视觉运动和身体平衡感对不上引起的恶心头晕)的成因写满教科书。在 VRChat 世界开发里,记住几条工程上可执行的规矩:

1. 不要强制移动玩家镜头

强制传送玩家是允许的(用 TeleportTo),但不要用脚本去强行平滑移动玩家镜头:拉着玩家在场景里飞、用动画控制摄像机沿曲线运动、强制旋转玩家朝向。这些操作让玩家的视觉运动跟前庭系统(耳内感知头部加速度的器官)对不上,几秒就晕。

如果世界需要「带玩家看一段过场」,更稳的做法是把玩家放到一个 VRC Station 里(第 16 章那个椅子机制),让 Station 移动;这样玩家身体跟着平台一起动,视觉和前庭一致。

2. 加速度比速度更晕

匀速移动的载具(电梯、列车)在 VR 里几乎不晕;急启急停、急转弯、瞬时变速度的载具会迅速放倒一片。如果世界里有可移动平台,让加速段尽量长,匀速段占大头,减速段也长。

3. 提供静止的视觉参考

在 VR 里看一段视频或观看一段动画时,画面里如果完全没有静止的视觉参考,玩家会感到被卷入。给观影区放一些不动的物体(座椅扶手、地板纹理、墙面边线)能稳住前庭判断。这跟现实坐车时看远方山线不晕、看车窗内侧晕同理。

4. 高速摇晃的物体要离玩家有距离

旋转的水晶吊灯、摇晃的吊扇放在玩家头顶 2 米内会显著加重晕。同样的物体放在远处的天花板上、隔着一段距离观察,没问题。

一个玩家「身体感」的对照实验

Section titled “一个玩家「身体感」的对照实验”

打开自己的世界,在 Hierarchy 里挂一个 Cube 当桌子,Position 0, 0.75, 1、Scale 1.5, 0.05, 0.8

Build & Test 进世界,走到桌子前。两件事可以观察:

  1. 桌面在哪个高度。一个 1.6 米 avatar 站桌前,桌面应该在腰部以上一点点(0.80.9 米)。如果桌面高过胸口,桌子做得偏高了。
  2. 手能不能自然搭在桌面上。VR 玩家伸手时手的高度大约是肩膀(1.41.5 米)。桌面太低(0.5 米)的话,VR 玩家要弯腰才能在桌面上摆东西,第 15 章的 Pickup 体验会变得很差。

把桌子的 Y 改到 0.5 再进一次,对比之下「腰高桌面」和「膝高桌面」的区别在 VR 里非常明显,桌面端几乎察觉不到。

这就是为什么 VRChat 世界必须在 VR 头显里测一遍。Editor 里看得过去的尺度,进 VR 经常立刻露馅。

VRChat 世界里几种常见空间的尺度起点

Section titled “VRChat 世界里几种常见空间的尺度起点”

把上面的规矩翻成几个具体房间的「不容易翻车」起点:

小书房 / 卧室
地面 4m × 4m
层高 2.6m
门 0.9m × 2.1m
家具 桌 1.4×0.7×0.75,椅 0.5×0.5×0.45
客厅 / 咖啡厅
地面 8m × 6m
层高 3.0m
走道 1.5m
家具 长桌 2.0×0.8×0.75,沙发座面高 0.4m
展厅 / Gallery
地面 12m × 8m
层高 4.0m
走道 2.0m
展品 画作中心高度 1.55m(中位视线)
舞台 / Event
地面 20m × 12m
层高 6.0m
舞台 高 0.6m,宽 8m,深 4m
观众席 半径 8m 的扇形

这些数都不是金科玉律,是「不容易第一次就出问题」的起点。具体世界要按风格调,但偏离这些数太远时,提醒自己一句「能不能在 VR 里实测一下」。

VRChat 玩家默认的两个动作受 avatar 尺寸影响:

  • 重力下落。Player Controller 重力是固定的,不随 avatar 尺寸变。1 米的小型 avatar 摔下楼跟 2 米的大型 avatar 摔下楼,下落速度感觉不一样。
  • 跳跃高度。玩家跳跃冲量通过 Udon 的 Networking.LocalPlayer.SetJumpImpulse(float) 设置;编辑器侧的入口习惯做法是放在第 5 章拖进场景的 VRCWorld Prefab 自带的玩家修改器组件里。具体字段名和默认值以你当前 SDK 版本的 Inspector 为准(旧版常见值是 3,对应大约能跳上 0.6 米的台阶;VRChat 引擎本身在没有任何修改器时默认 JumpImpulse 为 0,玩家是跳不起来的)。

如果世界里要玩家能跳上一个高度 0.6 米的平台,Jump Impulse 默认 3 大概够用;想跳更高就往上调,把它当一个无量纲的”冲量值”对待即可。具体值进 VR 测一次最稳。这两个数在第 5 章拖入 VRCWorld Prefab 时已经是默认值,要做平台跳跃类玩法时再回来调。

回到自己的世界,按这个清单走一遍:

  • 用 1.6 米 Cube 量门、走廊、桌椅、楼梯
  • 楼梯有没有用斜坡 Collider 而不是真台阶 Collider
  • 天花板在玩家头顶 0.5 米以上
  • 桌面在 0.70.9 米高度
  • 任何强制移动玩家的脚本(除了 Station 和 Teleport)都需要有理由
  • 进 VR(或 ClientSim 第三人称视角)走一圈,专门体会有没有「窄」「低」「卡」的瞬间

走完之后再 Build & Test。多数尺度类问题这一轮就能定位。