📖
关卡设计指南
  • 关卡设计指南
    • 什么是关卡设计
  • BOOK1:流程
    • 如何构建一个关卡
    • 预制作
      • 节奏
      • 研究
      • 构建世界
      • 规模
    • 战斗
      • 敌人设计
      • 遭遇战
      • 掩体
      • 地图平衡
    • 布局
      • 动线
        • 流通
        • 垂直性
      • 主要路径
      • 核心结构
      • 类型学
        • 门
    • 白盒
      • 体量
      • 指标
        • 模块化工具包设计
        • Doom的指标
      • 导向
      • 游戏测试
        • 玩家角色
    • 脚本
      • 门
    • 光照
      • 三点照明法
      • D6照明法
      • 暗光环境照明
  • 环境美术
  • 发布
  • BOOK0:研习
    • 关卡研习
由 GitBook 提供支持
在本页
  • 门的问题
  • 如何处理门的移动
  • 如何处理门状态
  • 锁着的门
  1. BOOK1:流程
  2. 脚本

门

如何编写脚本以实现滑动/旋转墙板(又称门)

上一页脚本下一页光照

最后更新于1个月前

众所周知,功能性门是电子游戏中最难实现的游戏对象之一。在本篇中,我们将概述门的实现为何如此棘手,以及在关卡中编写关于门的脚本的各种久经考验的策略。

门的问题

旋转门是一种动态几何体,它会阻挡可见性(有时)并阻挡移动(有时),可能会被打断、锁定或破坏,也可能被无生命的物体或人物遮挡......这种可能状态的广泛组合导致许多难以妥善处理的边缘情况。

有关门的难题的介绍,请参阅 Liz England 的博客文章,其中谈到门作为大型游戏工作室所有部门之间棘手的交叉点。

最简单、最稳定、无缺陷的电子游戏门类型就是没有门。因此,在为关卡添加门之前,请先问问自己,你真的需要那里有一扇门吗?

但是,如果必须有门,我们将讨论两类门的问题:运动和状态。

如何处理门的移动

首先,决定门的运动类型。

滑动门比旋转门简单得多。它们可以缩进墙壁/地板/天花板,并且不容易被阻挡而无法打开。但是,滑动门意味着一个有一个能够制造和操作滑动门的强大工业化社会,巨大的吊闸、运河船闸、基于传感器的玻璃超市门或未来科幻飞船门可能并不适合你的关卡世界观。

旋转门扫过大面积区域,很容易卡住物体,站着的人很容易挡住门,无法打开或关闭。这使得旋转门的物理原理比滑动门更复杂。然而,在现实世界中,旋转门比滑动门更平凡、更常见,也意味着非未来主义的世界观。

对于大多数门的物理问题,宁可为了玩家的方便而犯错。这是我们处理门的移动和碰撞的一般做法背后的基本指导原则:

  • 为了方便起见,旋转门应该是双铰链的,并且可以向两个方向打开。(来自《》)

  • 如果 NPC 可以使用门,他们的 AI 应该“挤”过门口,避免阻挡其他人。如果 NPC 有寻路 AI,则动态生成或手动放置 AI 提示节点,以强制 NPC 远离门,除非他们正在使用门。(来自》)

  • 如果关卡是关于探索的,那么就让打开的门保持打开状态,这样玩家就可以清楚知道他们去过的地方。但如果关卡是关于高度紧张的战斗的,那么玩家身后的门就会慢慢自动关闭,以简化遭遇空间。(来自》)

  • 使用物理引擎时,尝试物理模拟门硬件,即在刚体/铰链上施加扭矩或速度,以便它可以“自由”地与其他物理对象交互。(来自《》)

  • 门必须清除所有阻碍物才能关闭。

    • Ouake 风格的门会对阻挡物体造成伤害,有时会意外杀死玩家。这种机制将门施加了轻微的危险,适合 Quake 等大型街机动作游戏,但显然不适合其他类型的游戏。

    • 如果门的最终状态无关紧要,则让门半开着结束其运动,并且一旦它与其他物体碰撞(通过 ”)就禁用门关闭力。

    • 但是,如果无论如何都要强行关闭门,则应施加一个距离衰减的力来推开附近的物体,并对力设置一个上限。(来自》)

如何处理门状态

关卡通常有多种门,因此核心门脚本必须支持不同的行为。如果您的工具集中没有预先存在的门实体,您可能需要设计自己的门。

最基本的门有两种状态:打开或关闭。

但是动画门也可以移动——打开或关闭——有些门可以半开。您可能需要OpenStart, Opening, OpenFinished事件,以及CloseStart, Closing,和CloseFinished事件。这些不同的事件提供了插入声音、动画或物理效果的有用位置。

门对象的一些常见参数和设置:

  • moveDistance / rotateDistance,以引擎单位(滑动门)或度数(旋转门)为单位

    • 某些项目或实例可能需要可配置axis的运动(例如,吊桥不会绕其“向上”轴旋转)

    • 旋转门需要一个hinge位置,可以配置为物理铰链对象、网格原点,或配置为局部位置偏移 Vector3

  • moveSpeed / rotateSpeed,以引擎单位每秒(滑动)或度/秒(旋转)为单位

  • delayBeforeClose,以秒为单位。值为 -1 可能表示“保持打开,永不自动关闭”。

  • startsOpen,真或假。如果为真,门将在游戏开始时自动打开/默认为打开状态。更复杂的门可能会将其实现为一个initialAjarAngle值。在关卡编辑器中,门对象应始终处于关闭位置。

  • openOnTouch,真或假。如果为真,玩家可以触摸或输入不可见的触发器来打开门;如果为假,玩家必须手动激活门或使用按钮。

  • isLocked,真或假。如果为真,则默认情况下玩家无法打开门,必须通过找到钥匙或以某种方式禁用锁来解锁。

此外,您可能希望向关卡设计师展示打开或关闭门的不同方式。实现基本的Open()、Close()和Toggle()函数,以及可能应用额外物理技巧或传送的ForceOpen()或ForceClose()变体,以确保门无论遇到什么障碍物都能改变状态。

锁着的门

最简单的锁门状态是真/假。然而,这种二元性并不能准确反映我们在关卡设计中如何使用锁门。锁门可能会变得非常复杂:

  • 如果有些锁着的门可以被打开或关闭,而其他锁着的门无论如何都无法打开或关闭怎么办?这是两种不同类型的锁着的门。

  • 如果有些上锁的门是假门,不通向任何地方,只是用来填充墙面空间和暗示叙事循环的布景装饰,那会怎样?这是另一种不同类型的上锁的门。

  • 如果有些门可以被撬开,但某些与任务相关的关键路径上的锁需要特定的钥匙怎么办?(例如天际)这又是两种不同类型的锁门。

有关许多游戏中不同开锁机制的可玩概述,请参阅。

如果全局任务事件锁定了游戏中的所有门,但在任务结束后,又解锁了所有这些锁着的门,那么我们如何区分之前锁定且应该保持锁定状态的门,以及之前打开但现在应该解锁的门?(在《巫师 3》中,关卡设计师必须手动重新配置整个游戏中的每一扇门,请参阅)

“门问题”
最后生还者 2
《半条命 2
《最后生还者 2
Gone Home
“Gone Home
《生化奇兵 2
Johnnemann Nordhagen 的“机械博物馆:开锁”
“设计师如何意外打开了《巫师 3》中的每扇门”
“玩家还可以尝试走进一扇打开的门,凭借无限的力量,基本上可以将门从铰链上扯下来。”《Gone Home》中的开发者截图,来自
Johnnemann Nordhagen 的帖子“Code Judo”