Unity教程 制作一款文字冒险游戏
游戏灵感源自“火柴人亨利(Henry Stickmin)”系列游戏以及上世纪80年代的《惊险岔路口》冒险丛书。该游戏依据玩家的不同选择来推动故事情节发展,通常具备多重结局。
基本程序设计(故事卡)
游戏会向玩家展示一张“故事卡”。故事卡上的文字可分为两部分,一部分用于描述玩家当前的状态,另一部分则是玩家在当前情况下能够做出的一系列选择。
根据玩家的不同选择,剧情会沿着不同的分支向前推进,持续出现新的卡片与选择。当最终的卡片不再有新的选择时,游戏结束。
制作一张“故事卡”并不复杂。根据上述需求,我们新建 StoryCard 脚本,脚本代码如下(此处虽未给出代码,但后续可补充):
StoryCard 在检视面板中的显示情况如下:
您需要在 StoryCard 脚本的 Description 字段中输入卡片描述(即玩家在屏幕上能看到的文本)、玩家在选项按钮上看到的文字(目前该程序最多支持4个按钮),以及按下对应按钮后跳转的故事卡(也就是分支,稍后会详细介绍)。
StoryCard 脚本还包含两个故事状态属性:“States to Set True” 和 “States to Set False”。下面我们来详细了解这两个属性的作用。
故事状态与分支
实际上,整个游戏系统完全可以仅使用“故事卡”来构建,但这样会使游戏流程变得单调乏味。例如,有某个选项,玩家点击该按钮后,该选项所引发的后果不会立即在剧情中体现,而是在后续的剧情里逐渐展现。如果仅使用“故事卡”,就需要从该选项开始立即创建分支,并且在该选项导致的最终影响出现之前,所有剧情分支都要重复相同的步骤。
因此,我们需要一个更优的解决方案。
前面提到了“故事状态”的概念,它用于存储状态值,本质上是一个布尔值容器。卡片在被激活时,可以根据需求对特定的状态进行赋值。新建 StoryState 脚本,代码如下(此处可补充代码):
StoryState 脚本在检视面板中的显示如下图(可补充图片链接):
该方法解决了存储状态值的问题,接下来我们通过“剧情分支(Story Branch)”来应用这些状态值。一个分支会引用一个状态以及剧情发展的两个不同方向(可以是“故事卡”或者剧情分支),被引用的状态值用于决定剧情的走向。
游戏管理器
这个管理器的作用是承载整个剧情的发展,它会将当前的“故事卡”状态更新到UI上,在不同按钮被按下时做出相应的动作,并引导剧情向前推进。该管理器需要一个“故事卡”作为故事的开端。以下是 GameManager 脚本的内容(此处可补充代码):
其中,SetCurrentStoryItem 函数用于设置当前显示的剧情节点,SetCardDetails 函数用于设置“故事卡”的细节,如剧情描述、选项按钮及描述等,UpdateButtons 函数用于更新所有选项按钮及其响应事件。
GameManager 脚本在检视面板中的显示如下图(可补充图片链接):
项目资源
我们已经为大家准备了示例工程,其中包含两个场景:“Adventure” 场景包含一个简单的剧情,使用了一些简单的“故事卡”和状态;“Basic” 场景则是一个模板,您可以将其作为基础模板来开发自己的文字冒险游戏。