Notifications
Article
《莫塔之子》:如何使用程序化生成功能
Published 6 months ago
297
1
由Dead Mage工作室开发的2D地牢游戏《莫塔之子》,在开发过程中遇到了一个关键挑战:如何平衡Roguelike元素和故事发展?
本文将由《莫塔之子》的主程Reza Hooshangi分享,如何在游戏中结合Roguelike游戏的程序化生成功能驱动游戏进程的发展。
创建程序化系统需要定义规则和约束,从而限制游戏中的诸多可能性。本文将介绍定义关卡结构的方法,加入叙事元素时带来的挑战,以及Dead Mage工作室使用Unity开发的自定义工具,如何平衡游戏中的随机事件使玩家不断获得新鲜感以及支撑故事的叙事发展过程。

关卡结构

在《莫塔之子》的游戏中,每个关卡由多个以入口连接的空间组成。关卡中有多种空间和不同类型内容,例如:有的空间需要与众多敌人展开激战,有的空间带有靠运气取胜的神秘游戏,有的空间有等待玩家帮助的NPC,还有的空间是充满常规敌人的常规通道。
Reza Hooshang表示,在《莫塔之子》中,他们会为每个关卡定义一组参数,用于绘制空间并设定空间之间的连接方式。
Reza Hooshangi提供了下面的示意图,告诉我们一个关卡基础结构中具有大量可能性。
首先,确定基础结构。第一个图展示了关卡结构的简化版示例。
每个关卡都有一条由从起点到终点的多个空间,即空间0、1、2、3、4组成的主要路径。关卡还包含连接主要路径的多个分支,即死路,例如上图中连接空间6和空间7的分支路径。
然后添加规则,以确定如何在关卡中连接空间。
关卡结构参数会定义空间,并设定空间互相连接的限制。在上图的关卡中,带有奖励道具的空间连接着主分支的一个空间,但是不应该位于前半段路径上。分支路径也有自身的约束。
为了简单起见,我们假设这些空间总是和空间1连接。所以该关卡也可能如下图所示。
但是方向呢?目前,关卡结构没有显示任何与空间方向有关的信息。所以我们得到的关卡布局,它可能看起来像下图中任何一个布局。
每个空间有许多可能的形状和形式,因此使这些参数构建关卡会得到多个不同的关卡结构,如下图所示。
我们介绍了简单的关卡基础结构可以实现复杂的多样性,下面我们将进一步介绍程序化生成。

程序化生成结合叙事设计

有时,程序化生成和叙事设计的结合会导致临时修改关卡。例如在下图中,可以看到程序化事件要求添加二个额外空间。
R1空间包含一个NPC,NPC会请求玩家寻找并带回物品以换取奖励。此外,在主路径中,玩家会在另一个空间(即R2)找到目标物品。玩家必须经过战斗才能到达物品位置,然后拾取物品,将其交给NPC以获得奖励。
这只是程序化事件的一个简单示例,该事件在同一关卡内完成,你也有可能遇到其它类型的程序化事件,有的事件拥有更复杂的任务目标。
有时玩家需要多次尝试来完成剩余的故事支线。与此同时,玩家会找到其它程序化事件的线索。然而,因为这些事件是随机安排的,不同玩家会在完全不同的情况下遭遇这些事件。

程序化内容

设置好空间后,我们要向空间加入程序化内容。《莫塔之子》包含多个子系统用于生成和管理不同类型的内容。如果你像Reza Hooshangi一样,喜欢着《黑客帝国》系列电影,就不会对《莫塔之子》中子系统名称感到陌生。

  • Key Maker(制钥人):用于处理房间之间的所有入口和连接
  • Oracle and Persephone(先知和珀耳塞福涅-冥后):用于在特定关卡中放置环境资源、叙事对象和过场动画等内容。
  • Tank(坦克):用于生成和管理寻路图,坦克对应《黑客帝国》中操作气垫船的角色。
  • Smith(史密斯):用于生成敌人。
  • Merovingian(梅罗纹加):用于在关卡中散布金钱,虽然在《黑客帝国》中,梅罗纹加没有在世界散布他的钱财。
每个子系统都有自己的参数集,用于为特定关卡定义准确的行为。因此,每个关卡都有用于设定形式和布局的结构性参数,以及内容生成子系统的参数集。

如何平衡随机事件和故事进展

上文提到的所有参数的集合包括程序化算法用于生成关卡的所有内容和其中的附带信息。每个游戏关卡都有预先设计的参数集,它们拥有各自的功能和特性。
但是《莫塔之子》在所有流程之间都有一个线性故事,该故事与限制预设集的作用相反。
一方面,少量限制会产生完全不同随机的关卡,它们没有任何进度感和意义。另一方面,如果关卡都是预先设计的,每次游玩体验都会完全相同,无论游戏是否有叙事发展。

创建有意义事件链的自定义工具

为了使游戏元素之间具有一致性和有意义的联系,从而为玩家提供有意义的体验,Reza Hooshangi的团队在Unity中开发了一个称为Train Man的自定义工具。
该工具系统了解游戏中发生的所有事件,它能改变将要使用的参数。每当程序化系统生成新关卡时,该工具会收集所有默认参数,并将参数发送给Train Man。然后这些参数会经过修改,以反映故事的当前阶段。
在首次运行游戏时,该工具会处理关卡的生成参数,添加一个特别空间,里面包含一只在母亲尸体旁战斗的狼崽。救出狼崽会开始一项影响程序化生成的新任务。例如在游戏后期,你会在某个关卡角落找到一个空间,里面有给狼崽用的药。
狼崽的故事线只是众多程序化事件中的一个,Dead Mage工作室制作的自定义工具会储存和管理玩家档案中多个活动的程序化事件。
如下图所示,所有发生在程序化事件期间的内容都会被跟踪,在时机成熟时,程序化参数将根据进展进行调整。
Train Man工具让Dead Mage工作室可以独立完成每个程序化事件,从而使生成关卡与活动程序化事件的当前状态相互匹配。
这样会为不同关卡实现大量可能性,使玩家每次在特定关卡活动时,都会得到随机感和新鲜感。与此同时,它还实现了特别的临时修改功能,让玩家感觉在主线故事的大背景下还发生着其它有意义的故事。

其它功能

Train Man工具会跟踪玩家的关卡进展,管理支线任务和叙事过程,从而让玩家了解故事进度。他们还用该工具实现了不少其它功能,从而确保积极的玩家体验。
动态难度:对于程序化事件,该工具可以跟踪玩家的行为,修改敌人和陷阱的生成数量,以及回血道具和金钱的掉落数量等内容,从而使游戏难度与玩家的技术相互平衡。
解锁内容:开发人员可以隐藏部分随机内容,当玩家使用默认内容一段时间后,会将随机内容添加到游戏中。这有助于降低玩家在游戏中的受挫感,提高反复游玩的价值。
分析:衡量和分析玩家的行为,从而了解玩家喜欢该游戏的原因。

小结

对于《莫塔之子》中程序化生成功能的组成部分,Dead Mage工作室的开发人员设定了规则和约束,因此每个关卡都几乎有无限的可能性。这样便解决了在Roguelike地牢游戏中,赋予玩家全新体验的问题。
开发人员通过自定义Train Man工具扩展了Unity,实现对约束的临时修改功能,并且通过让玩家感觉《莫塔之子》世界中发生的事情拥有意义,维持了游戏中由叙事驱动的框架。
更多Unity创作经验分享,尽在Unity官方中文论坛(UnityChina.cn) !
Unity China
576
Comments
Wang Shuai
6 months ago
师从百家,自学成才
马克不菠萝
0