主要设计要求

*此内容使用人工智能(Beta)翻译,可能包含错误。若要查看英文页面,请点按 此处

以下列表提供了我们在研究 Duvall Drive 的神秘 时考虑的主要技术设计要求的概述。了解有关这些元素的视觉设计的更多信息,请参阅 Duvall Drive展示的神秘,其中突出了我们使用 Studio 创建沉浸环境的各种功能和工具。

任务

玩家必须解决的任务类型有几种,以进步通过体验,包括导航一个 系列旋转平台 直到玩家能够检索特殊物品,或在一个 扩展仓库 中找到不同的成分并将其放入锅中。为了组织创建和调试任务的脚本过程,我们创建了任务框架和调试版本。

任务框架

为了确保我们在整个体验过程中统一每一步的任务,我们为每个任务设计了一个 简单的拼图任务框架 ,其中包含启动和完成拼图的钩、读取配置数据的地点和完成拼图的按钮,用于 调试目的。了解有关该过程和其参数的更详细信息,请参阅任务逻辑

海豹和游戏状态

当玩家进入特定房间时,我们希望他们与被称为 海豹 的特殊小物体互动,以触发任务。在他们解决任务之后,我们希望他们抓住印章并将其放置在大厅内预定位置,以便进行整个游戏的进展。他们将密封放在正确的位置后,可以继续到房屋内另一个房间并单击该房间的特殊对象,开始下一个任务。

我们开发了一个简单的抓取系统,用于通过将对象附加到角色的右臂来抓住对象。
玩家需要放置每个印记进行体验的入口。

为了实现这一点,我们创建了 游戏状态 ,这将指定玩家可以开始处理的时间期间,例如:

  • 在房间中寻找一个“损坏”的印章来触发任务。
  • 当他们解决任务时,拿起“恢复”的印章。
  • 将密封放置在大厅圈内。

游戏状态大多控制体验的流程和玩家与体验的故事互动方式。了解更多信息,请参阅游戏状态管理器

普通和损坏的房间

我们想在房子里有两个状态的六个房间:一个正常状态和一个损坏状态。当玩家触摸房间中的损坏密封时触发房间的损坏状态时,环境将切换到更暗的氛围,包括修改的照明、环境物体和特殊效果。玩家必须解决任务才能返回房间的正常状态。

调查的正常状态
研究的损坏状态

为了实现这一点,我们在体验中准备了一个特殊空间,距离房子很远,大约有 6,500 个螺柱在 X 方向上,可以容纳房间的损坏状态。当玩家触发任何损坏状态时,该特定房间的损坏状态会克隆到此区域从 ServerStorageTempStorage/Cloned 文件夹,然后玩家 传送到该房间。小Parts 在每个正常和损坏的房间中存在,可以作为玩家进入或离开房间的生成点。在他们解决任务后,我们同时将玩家传送回房间的正常状态,并摧毁房间的损坏状态中的所有对象。了解有关控制此传送过程的游戏状态的更多信息,请参阅游戏状态管理器

调试版本

为了帮助我们定期调试任务,我们创建了一个版本的体验,在这里我们不需要等待在大厅或切场中。该版本具有基于键盘的捷径和按钮,可以让我们自动完成任务,以便我们快速测试体验的方面。我们会定期复制并发布这个版本到我们计划发布的版本中,该版本具有正确的游戏流程。为了区分这两个版本,我们制作了一个 DemoGlobalSettings 脚本来检查 placeID,看看它是否在 Studio 中运行,并启用/禁用各种游戏漏洞和按钮。了解更多信息,请参阅任务逻辑配置脚本

传送

体验中发生的三种传送类型:

  1. 从简单的大厅传送玩家到保留服务器中的主游戏区域保留服务器
  2. 从房间的正常状态传送玩家到损坏状态,然后在显示 切场 时返回。
  3. 在一些谜题中传送玩家,或当他们在游戏区域下落后重生时重生

保留服务器

我们决定将玩家分组为五个小组在一个简单的大厅 ,然后将它们传送到房子的主游戏区域的 保留服务器 。大厅为额外的玩家提供了加入和一起玩的时间,保留服务器防止额外的玩家错过游戏和叙事的方面加入体验。此传送只发生一次。

切场景

我们希望能够在玩家完成特定任务时,随时随地运送他们,例如触摸海豹或完成任务。为了实现这一点,我们开发了一个简单的脚本驱动工具称为 事件管理器 的简单版本,该工具控制了各种属性和特性,运行了脚本和音频,并在一段时间内执行了相机抖动。这允许我们同时移动玩家和在不同房间传送并将此过程从特殊效果中隐藏给玩家。了解更多信息,请参阅事件管理器

重生玩家

我们想要实现的第三种传送类型是短距离传送,只有玩家 CFrame 在一些谜题中的坐标变更和当玩家掉落并重生时。与前两种类型的传送不同,这种类型不需要明确要求异步传输。

游戏剧本脚本

脚本允许我们执行特定玩家戏元素,例如渐渐消失的用户界面元素、为键盘事件创建触发器音量并将对象放在焦点上时突出显示。许多这些系统依赖标记对象来执行自定义行为,然后使用各种客户端或服务器脚本来容纳特定的工作流程,根据需要在体验中设置的特定时间点发生的行动。了解有关我们如何实现这些系统的更多信息,请参阅基础游戏系统支持系统

带标签的自定义行为

我们想要一个方法来为对象添加自定义行为,例如锁定门,以便玩家在完成激活任务之前必须留在房间内。为了实现这一点,我们决定使用标签为特定对象,然后使用 CollectionService 来找到这些对象并将任何相应的 Scripts 连接到添加自定义行为。我们为每个标签类别配备了一个 Script 来处理该类别下标记的所有对象,因此我们可以将 Script 保留在单个位置而不是被复制多次在 DataModel 中。了解更多信息,请参阅门管理器主动画师抽屉管理器杀死音量玩家任务重生钢琴管理器

“管理员” Script 使用一个 Init 函数来找到体验开始时标记的任何对象,并将自定义行为连接到它们。例如,DoorManager 找到标有 的任何对象,然后将正确的行为附加到门对象 (打开门时移动,播放门摆动音效等)。然而,在执行时间时添加或移除的任何对象,例如玩家与损坏的密封互动后添加到损坏房间的任何对象,都会错过此初始调用,永远无法获得期望的行为。为了解决这个问题,我们使用 CollectionService.GetInstanceAddedSignalCollectionService.GetInstanceRemovedSignal 来授予标记和未标记的新对象相同的行为。

客户端和服务器脚本

我们想减少对游戏性能昂贵的不同方面的带宽。我们决定,当对象功能可以影响其他玩家的模拟,例如通过碰撞移动对象,我们将在 服务器 上运行此操作,但如果有些东西与环境设计更相关,例如灯光、环境动画不会影响游戏玩法、特殊效果和音频,我们将在 客户端 上运行它们。这将减少带宽,并保证用户设备上的移动和环境变化更顺畅。