在《奥秘法师》中分离游戏引擎与游戏逻辑的方法及其对《元素恶魔圣殿》快速开发的影响
Timothy Cain
总结:
在《奥秘法师》的开发过程中,游戏引擎与游戏逻辑被刻意分离,以提升开发效率和代码可维护性:
- 分离策略:核心引擎功能(如加载、动画、脚本处理)与具体游戏机制(如属性、技能、战斗)被放置在不同的C文件中。
- UI的独立性:用户界面(UI)作为单独的库进行编译和链接,与游戏引擎和游戏逻辑完全分离。
- 分离原因:
- UI设计频繁变动,独立开发避免影响核心游戏代码。
- UI仅负责数据显示,不应包含游戏决策逻辑,防止程序员误用数据流。
- 数据流向:游戏逻辑将数据发送给UI,但UI不向游戏逻辑回传决策性信息,确保了单一数据流向。
- 开发优势:这种模块化设计使得团队能够利用《奥秘法师》的引擎快速开发《元素恶魔圣殿》,即使游戏机制和UI都完全不同。
- 行业影响:这种在90年代和2000年代并不常见的实践,如今已成为现代游戏引擎设计(如Unity)的标准做法,提高了代码质量和重用性。
视频回应了观众关于《奥秘法师》(Arcanum) 中如何将游戏机制与引擎部分分离的问题。作者强调,这种分离与他之前介绍过的操作系统抽象库 (TIG 和 Gnol) 的概念非常相似,其核心在于将游戏的特定部分封装到库中,以实现抽象化,无需关心底层平台细节。
游戏引擎与游戏机制的分离实践 [0:01:07]
在《奥秘法师》的开发中,团队特意将游戏引擎与游戏特有的机制(即与《奥秘法师》IP相关的部分)保持分离:
- 代码组织方式
- 所有相关的函数、结构和私有变量都被组织到各自的 C 文件中。
- 游戏相关文件:包含游戏特有的逻辑,例如属性 (stats)、技能 (skills)、法术 (spells) 和战斗 (combat) 系统。
- 引擎相关文件:处理与游戏规则无关的通用功能,如扇区加载 (sector loading)、瓦片加载 (tile loading)、精灵加载 (sprite loading) 和动画 (animation)、脚本加载和处理。这些文件是“无感知的”,可以在任何游戏中使用。
- 编译与链接
- 这些 C 文件虽然逻辑上分离,但被编译在一起并放入同一个库 (.lib) 中,随后与可执行文件链接。
- 这种方法既能实现数据在文件间的有效流动,又能通过文件分类清晰地区分引擎代码和游戏代码。
用户界面 (UI) 的独立性 [0:02:51]
除了核心的游戏引擎与逻辑分离,游戏的用户界面 (UI) 也被独立出来,形成一个独立的库:
- UI 的独立存储与编译
- 整个游戏的用户界面代码不仅保存在独立的 C 文件中,还被放在一个单独的文件夹中,并单独编译成一个库。
- 该 UI 库随后作为可执行文件的一部分单独链接。
- UI 独立的两大原因
- UI 频繁变动:用户界面编码是耗时巨大的工作,经常需要重做。
- UI 设计在开发过程中经常迭代,有时代码会变得混乱(“意大利面条代码”)。
- 美术资源也可能改变,如分辨率适配或平台特定(Xbox、PlayStation、Switch 控制器有不同的美术表现)。
- 游戏不需要知道输入来自哪个平台,但 UI 必须关心这些细节。
- UI 不做游戏决策:UI 仅负责数据的显示,不应包含任何游戏逻辑或决策。
- UI 从游戏获取数据,但游戏不应从 UI 获取数据或询问 UI 做出任何决策。
- 通过将 UI 隔离在独立库中,并限制数据单向流动,可以防止程序员错误地从 UI 获取游戏核心信息。
- 战斗回合制示例 [0:05:45]
- 在《奥秘法师》中,当回合制战斗开始时,游戏的核心战斗模块会计算行动顺序 (initiative),并将结果发送给 UI。
- UI 可以自由选择如何显示这些信息(例如,显示所有角色的行动顺序、仅显示当前行动角色、通过高亮或箭头指示),而游戏代码无需关心 UI 的具体表现形式。
- 这确保了即使 UI 的显示方式改变,游戏的核心逻辑也保持不变。
对《元素恶魔圣殿》开发的影响 [0:07:16]
《奥秘法师》的这种分离式开发决策,在后续开发《元素恶魔圣殿》(Temple of Elemental Evil) 时带来了巨大优势:
- 快速开发周期
- 在《奥秘法师》发布后,团队接到了在18个月内开发《元素恶魔圣殿》的机会(尽管由于 D&D 3.5 版规则的突然发布,实际用了20个月来重新调整规则)。
- 之所以能如此迅速地完成,正是因为引擎与游戏逻辑的清晰分离。
- 引擎复用与修改
- 仅需修改少量的引擎文件。
- 例如,将 2D 精灵改为 3D 模型,背景地图不再是瓦片拼接,而是 3D 渲染的大图,并引入深度缓冲来处理角色被遮挡时的显示。
- 大部分核心引擎结构保持不变,极大地节省了开发时间。
- 全新游戏内容与 UI
- 所有游戏文件都是全新的,以适应《龙与地下城》(D&D) 的规则(如新的属性、战斗系统和类 (classes) — 《奥秘法师》中没有类概念)。
- 用户界面也完全重做,采用了全新的 UI 库,以适应《元素恶魔圣殿》中独特的径向菜单等设计。旧的 UI 被完全废弃,因为新的游戏逻辑需要接收不同类型的数据。
现代游戏开发中的分离实践 [0:09:10]
这种游戏引擎与游戏逻辑分离的做法在90年代和2000年代并不普遍,但如今已成为行业标准:
- 现成引擎的普及:借助现成的游戏引擎(如Unity、Unreal Engine),这种分离变得日常化。
- 引擎灵活性:
- Unreal Engine 允许开发者修改引擎代码,但如果将游戏数据硬编码到引擎代码中,可能会模糊界限,带来维护问题。
- Unity 则通过将游戏逻辑封装为由引擎调用的脚本,自然地实现了游戏与引擎的分离。
- 历史意义:早期采用这种分离策略不仅改善了代码状态,还使得团队能够高效地重用《奥秘法师》的引擎来开发《元素恶魔圣殿》。