Crooked Sheriff:打造 VR 狂野西部密室逃脱体验

简介

作为密室逃脱游戏的粉丝,我们知道这种游戏造成了很多关于现实世界的局限性。密室逃脱场地的物理空间通常非常有限,一次只能容纳几个场景。这些场景也存在固有的局限性:体验过一次后,玩家几乎没有重复体验这种场景的兴趣。为了跟上受众的需求,“密室逃脱”必须不断更新;这个过程必须花费较长的时间进行设计和构建。

Imprisoned game scene sheriff
图1.被监禁的游戏场景,包括腐败的警长。

我们认为虚拟现实 (VR) 至少可以减少部分局限性。在 VR 中构建“密室逃脱”场景,物理空间不再是问题。可以创建分支故事路径来提高可重复性,更新期间的停机时间也会因此而缩短。

但我们发现,虽然 VR 可以解决一些问题,但也有一些劣势。

构建游戏世界

开始开发“VR 密室逃脱”时,我们决定不在素材创建方面花费太多时间;相反,我们要专注于提供最佳用户体验。我们首先在 Unity* 软件素材商店搜索合适的构建模块,重点关注主题一致性和逼真的图形。我们找到了一个狂野西部风格的警长办公室素材1,为我们的 VR 游戏奠定了坚实的基础。

然而,尽管对我们来说这个素材非常重要,但办公室素材还是有一些漏洞。为了进行修改以满足我们的用途,我们必须重新映射建筑物的部分纹理,并拼接几乎所有网格的顶点,以确保烘烤灯光时实现高质量2

Sheriff’s office
图2.警长办公室概览。

在 Unity* 软件中设置 VR

接下来我们实施 VR 头显集成。我们选择使用 Steam* VR Unity 软件 3D 插件3,它提供全面的 VR 开发框架、支持 OpenVR,并与Oculus Rift*HTC Vive* 无缝协作。

Setting up a box collider
图3.在 Unity* 软件中设置盒式碰撞器。

在 VR 中从 A 到 B:走路、漂移,还是远距传动?

虽然在 VR 中走路是最自然的出行方式,但开发设置的物理空间有限,这是大多数 VR 游戏面临的问题。因此,我们必须选择使用操纵杆或远距传动,作为玩家和“密室逃脱”之间的主接口。

操纵杆移动 — 第一人称射击游戏(FPS)游戏的主要部分 — 学习起来很简单。但缺点是会造成晕动病4,这是许多 VR 游戏面临的问题。在我们的示例中,玩家最明显的反应是恶心,因为狭窄的虚拟空间似乎会加重症状;因此我们选择远距传动。虽然远距传动会影响沉浸感,但在探索游戏世界时,它仍然是一种非常可靠手段,同时会大大缓解恶心反应。

与对象进行交互:运动学方法与非运动学方法

在 VR 中与对象交互的两种既定方法是:

  • 运动学方法,在虚拟世界中玩家持有的对象没有任务物理约束。运动物体可以穿过任何静态障碍物(如墙壁),而且无论大小或质量,运动物体都可以击退动态对象。
  • 非运动学方法,其中玩家的抓握变成可延伸至被抓物体的枢轴关节。非运动物体跟随手部移动,但不能穿过静态障碍物,只有在质量和速度允许的情况下才能击退其他对象。

SteamVR 在与对象交互时使用运动学约束。这样会影响沉浸感,但有利于玩家更准确地操纵对象并减少物理错误的出现。因此,我们选择这种方法。

接下来,我们在 SteamVR 中设置一个可交互对象。

如果要在 SteamVR 中拾取、扔下或投掷某个对象,需要添加脚本。我们使用 Throwable 脚本,其中包括刚体、可交互和速度估计器变量。我们确保至少有一种凸面碰撞器,而且在刚体脚本中设置的质量与对象类型保持一致。

但我们的煤气灯对象(见图4)是混合型。把手是运动的,灯本身是非运动的。把手连接了标准 SteamVR 组件。它还有连接灯体的铰链接头,旋转轴位于把手的两耳之间。灯本身是采用胶囊碰撞器的刚体,玩家不能直接拿起来。但当玩家拿起把手时,把手会变成运动的,并且铰链接头能让灯随玩家移动而自由摆动。

Gas lamp object in Unity
图4.Unity* 软件中的煤气灯对象。

如果开发人员想尝试使用非运动学方法,我们建议使用 Tomorrow Today Labs5 的 NewtonVR Unity 软件素材。这个坚固的框架基于 Steam 和 Oculus VR 平台构建,支持拾取、投掷和其他对象操作形式,同时能够充分利用 PhysX。这意味着手握物体不能相互穿过或穿过墙壁。这个素材中包含基本碰撞声效包。

创建谜题

谜题是所有密室逃脱体验的核心。在我们的体验中,背景故事是,玩家是被腐败警长非法监禁的受害者。因此玩家的第一个挑战是逃离被锁的牢房。

首先,玩家必须发现牢房内放在食物下方的锉刀。可以用这把锉刀切割腐坏变形的木条,直到木条断裂。牢房钥匙挂在另一面墙上的钉子上,玩家必须伸出手,抓住钥匙,然后用它逃生。

Key ring and key object
图5.Unity* 软件中的钥匙圈和密钥对象。

性能限制意味着 Unity 软件不支持用于物理计算的非凸面碰撞器。这给我们的钥匙圈和钥匙带来了问题。为了保持两者之间的物理交互,我们不能依赖默认的非凸面网格碰撞器。相反,我们创建了盒式碰撞器,它近似于环状,而且支持无缝交互。

没有保险箱的狂野西部冒险是不完整的,所以我们在第二个牢房里放了一个保险箱。保险箱是游戏的最终目标,因为它放置了警长攫取不义之财的证据。玩家必须获取这些文件,终结坏蛋的卑鄙行为。

这样产生了一个有趣的转折:为了获胜,玩家必须先从一个牢房逃出来,然后破门进入另一个牢房。

保险箱上的旋转锁是一个有趣的元素。圆形驱动组件 — SteamVR 的一部分 — 支持我们将对象标记为可由玩家旋转的对象。然而,对于仅在玩家触摸时旋转的物体来说,这还不够,我们需要一个脚本,以便旋转能够对应锁盘上的标记。出于这一目的,我们可以使用以下代码:

float _zero = 180f;
float _mid = 0f;
float _gap = 360f / 100f;
float _midPointNumber = 50;

if (transform.rotation.eulerAngles.z > _zero || transform.rotation.eulerAngles.z<_mid)
rotationValue = Mathf.RoundToInt(-((_zero - transform.rotation.eulerAngles.z) / _gap));
else
rotationValue = Mathf.RoundToInt(_midPointNumber + Mathf.Abs(_midPointNumber - (_zero - transform.rotation.eulerAngles.z) / _gap));

锁的表盘上有 100 个位置。零位于 6 点钟方向,中点数位于 12 点钟方向,为 50。为了映射这些刻度,我们将零指定为 180 度旋转。锁盘为整圆,因此中点为零度,每个数字之间的间隙为 3.6 度。代码根据锁盘旋转的象限将旋转映射到锁盘上的数字。

添加挑战

为了进入有保险箱的牢房,我们希望其中的挑战比简单的钥匙和锁盘大。因此,我们创建了一个装置,其中有五根颜色不同的杆,每根杆对应上面的一个基座。我们还在杆内部放了五盏煤气灯。玩家必须找到所有五盏灯,将它们放在正确的基座上,然后打开它们(见图6)。为此,必须将灯的控制杆从初始位置 — 无论是向上还是向下 — 移到对立的位置。问题在于,移动操纵杆时,操纵杆会触发邻近的杆切换位置。玩家成功点亮所有五盏灯时,有保险箱的牢房门打开。

Lamps puzzle
图6.灯谜。

每根杆都有一个圆形驱动器,我们希望移动杆时有触觉反馈。幸运的是,SteamVR 提供组件:触觉机架。您可以将其添加到对象,配置数值以达到所需的感觉,并分配相同的线性映射组件用于圆形或线性驱动器。

触觉效果到位后,我们寻找一种与之匹配的磨削噪音,并在 freesound.org 上发现了一种长时间运行的刮擦金属的音效。在 VR 游戏中,移动操纵杆会触发这种声音。(体验效果。)

解决问题

在 SteamVR 中,默认情况下您的头部可以作为运动对象;也就是说,您的头部能够穿过墙壁和物体。我们意识到,尽管将远距传送限制在解锁区域,但没有任何东西能够阻止玩家轻松走出牢房。我们的解决办法是,在玩家头部进入物体内部时,视图淡化为黑色。我们在摄像头上添加了一个触发器球体碰撞器,还添加了一个脚本,用于在玩家进出时添加和删除触发器。

为了防止玩家将头部伸出墙壁或对象碰撞器,我们创建了触发器碰撞器,来填充玩家未解锁的区域。它们会在检查点解锁时移动或移除。我们有一个根据进展解锁远距传动区域的系统,因此添加碰撞器非常简单。

Passing through walls
图7.穿过墙壁。

为了增强沉浸感,我们为所有彼此碰撞的对象添加音效。我们使用了 PhysSound6,这个素材设置非常简单,还包含刮擦音效。(体验效果。)

结论

我们很少将 VR 密室逃脱体验视作现实密室逃脱体验的替代品,更多地将其视作是一种补充。两者之间的混合能够打造出一种无与伦比的体验。

使用 Unity 软件 3D 从头创建 VR 体验能够让我们有机会学到很多。希望我们在开发 Crooked Sheriff  的过程中所分享的知识和技巧能够帮助您创建出令人惊叹的 VR 项目。

请畅玩经过我们解说的 Crooked Sheriff。谢谢!

参考资料

  1. https://assetstore.unity.com/packages/3d/props/interior/sheriff-s-office-67625
  2. https://docs.unity3d.com/Manual/LightMode-Baked.html
  3. https://assetstore.unity.com/packages/templates/systems/steamvr-plugin-32647
  4. https://en.wikipedia.org/wiki/Virtual_reality_sickness
  5. https://assetstore.unity.com/packages/tools/newtonvr-75712
  6. https://assetstore.unity.com/packages/tools/audio/physsound-37650
  7. https://www.youtube.com/watch?v=GfCvFm-1IZw

关于开发人员

AndreiSilviu 是英特尔® 软件创新者计划的成员。他们致力于研究软件开发、人工智能、游戏开发和虚拟现实。他们开展了多个前瞻性项目,比如 Drill Sergeant SimulatorHELIOSASTRO

Для получения подробной информации о возможностях оптимизации компилятора обратитесь к нашему Уведомлению об оптимизации.
Возможность комментирования русскоязычного контента была отключена. Узнать подробнее.