32. 空间、比例和舒适
第 31 章把「第一帧看见什么」做对了。玩家走第一步之后,下一个决定他要不要留下来的因素是身体的尺度感:门会不会撞头、走廊会不会肩膀刮到墙、椅子的高度合不合适、楼梯踩起来会不会晕。
这些数字在 PC 桌面端不那么敏感(视角是相机,相机不会撞头)。一旦换到 VR,玩家自己的身体就在场景里。门低 10 厘米,VR 玩家需要弯腰;走廊窄 30 厘米,VR 玩家会下意识缩肩膀。空间的「舒适」是非常具体的几个数字。
这一章把这几个数字摆出来。
VRChat 玩家的默认尺度
Section titled “VRChat 玩家的默认尺度”VRChat 玩家的「身高」由几件事决定:
- Avatar 模型本身的身高。模型骨架决定头顶在哪。
- 玩家自己设置的视高(Eye Height)。VRChat 客户端里玩家可以校准自己 VR 头显的真实视高。
- 运行时缩放。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.70–1.80 米 | 视高 + 头顶到眼的差 |
| Spawn Y 设到 0 时玩家眼睛 | ~1.60 米高 | 见上 |
| Avatar 体宽 | 0.5–0.6 米 | 走廊估算的下限参考 |
| Avatar 步长 | 0.5–0.7 米 | 楼梯踏步深度参考 |
Avatar 千变万化,这些数只是「假设玩家用一个普通人形 avatar」时的中位数。做尺度时按这个中位数走,再给上下两端各留一点余地。
门高、走廊、天花板:三个底线数字
Section titled “门高、走廊、天花板:三个底线数字”把这三件事按 VRChat 里能用的最小可接受数字列出来:
| 元素 | 安全下限 | 推荐值 | 说明 |
|---|---|---|---|
| 门洞高度 | 2.0 米 | 2.2–2.4 米 | 现实住宅门约 2.0 米,公共建筑 2.1+;VR 里给玩家留头顶空隙 |
| 走廊宽度 | 1.0 米 | 1.5–1.8 米 | 1 米够 1 个 avatar 通过,但 VR 玩家会感到压迫;社交世界至少 1.5 米 |
| 天花板高度 | 2.4 米 | 3.0 米以上 | 室内场景;VR 玩家头顶有 0.5 米余量才不感到压顶 |
这些是「不让 VR 玩家本能不舒服」的下限,不是「最优体验」。如果世界主打安静聊天的咖啡厅,天花板可以低一点(现实的咖啡厅常 2.6 米),但要换来更好的灯光和氛围。如果世界要承载活动、聚会、舞台,天花板和走廊要再宽到 5 米以上才不挤。
在 Unity 里直接量
Section titled “在 Unity 里直接量”打开自己的世界,在 Hierarchy 里建一个空 GameObject 当临时尺子:
Create Empty命名_Ruler_Player。- 加一个子 Cube:Position
0, 0.8, 0、Scale0.5, 1.6, 0.3,颜色用一个明显的洋红材质。 - 这个 1.6 米高的「人形」可以拖到场景任意位置当尺子。
走到自己造的门口,把人形拖过去,看头顶有没有撞到门楣。看走廊时把人形多复制几个,模拟两人迎面通过。这一步做完,多数尺度问题在编辑器里就被发现了,不用每次都 Build & Test 再进 VR 验证。
楼梯和坡道:VR 里最容易翻车的细节
Section titled “楼梯和坡道:VR 里最容易翻车的细节”楼梯是 VR 玩家晕动症的高发区。两个原因:
- 视觉抖动。VRChat 玩家走楼梯时镜头会按台阶高度上下跳。在 VR 里这个跳动会被身体当成「自己被颠了一下」。
- 碰撞不连续。如果楼梯踏面之间有缝隙、踢面(垂直部分)有 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。
VR 不让人晕的几条硬规矩
Section titled “VR 不让人晕的几条硬规矩”晕动症(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.6 米 avatar 站桌前,桌面应该在腰部以上一点点(
0.8–0.9米)。如果桌面高过胸口,桌子做得偏高了。 - 手能不能自然搭在桌面上。VR 玩家伸手时手的高度大约是肩膀(
1.4–1.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 里实测一下」。
玩家尺寸的两个隐形假设
Section titled “玩家尺寸的两个隐形假设”VRChat 玩家默认的两个动作受 avatar 尺寸影响:
- 重力下落。Player Controller 重力是固定的,不随 avatar 尺寸变。1 米的小型 avatar 摔下楼跟 2 米的大型 avatar 摔下楼,下落速度感觉不一样。
- 跳跃高度。玩家跳跃冲量通过 Udon 的
Networking.LocalPlayer.SetJumpImpulse(float)设置;编辑器侧的入口习惯做法是放在第 5 章拖进场景的VRCWorldPrefab 自带的玩家修改器组件里。具体字段名和默认值以你当前 SDK 版本的 Inspector 为准(旧版常见值是3,对应大约能跳上 0.6 米的台阶;VRChat 引擎本身在没有任何修改器时默认 JumpImpulse 为0,玩家是跳不起来的)。
如果世界里要玩家能跳上一个高度 0.6 米的平台,Jump Impulse 默认 3 大概够用;想跳更高就往上调,把它当一个无量纲的”冲量值”对待即可。具体值进 VR 测一次最稳。这两个数在第 5 章拖入 VRCWorld Prefab 时已经是默认值,要做平台跳跃类玩法时再回来调。
自己改一遍场景
Section titled “自己改一遍场景”回到自己的世界,按这个清单走一遍:
- 用 1.6 米 Cube 量门、走廊、桌椅、楼梯
- 楼梯有没有用斜坡 Collider 而不是真台阶 Collider
- 天花板在玩家头顶 0.5 米以上
- 桌面在
0.7–0.9米高度 - 任何强制移动玩家的脚本(除了 Station 和 Teleport)都需要有理由
- 进 VR(或 ClientSim 第三人称视角)走一圈,专门体会有没有「窄」「低」「卡」的瞬间
走完之后再 Build & Test。多数尺度类问题这一轮就能定位。