将作家变为程序员:如何做更快速、更可持续的剧情研发?

【GameLook专稿,未经授权不得转载!】

GameLook报道/对于很多游戏而言,故事剧情是带给玩家沉浸感非常重要的因素。然而,对于大多数的团队来说,剧情写作是个很棘手的问题,在缺乏编程知识和工具的情况下,很可能需要巨大的工作量,而且往往很难做出比较优秀的剧情设计。

在此前的GDC演讲中,《林中之夜(Night In The Woods)》开发商Secret Lab工作室的Jon Manning与美国知名作家Ryan North探分享了剧情工具Yarn Spinner的研发过程,并讨了如何更快速、更可持续剧情工具的研发,并提出了将剧情作家变为程序员的想法。

以下是Gamelook听译的完整内容:

传统游戏剧情创作工具的问题

Jon Manning:我们今天要分享的内容包括什么是灰盒剧情(Greyboxing Narrative),如何节约时间和资金以及如何写更好的故事,还会向你们展示剧情作家成为程序员的想法,那怕只是一点点。

我是Jon Manning,在澳大利亚一家小公司Secret Lab工作,我们最著名的游戏是《林中之夜》,我还是Yarn Spinner项目的主开发者。

Ryan North:

我是Ryan North,是很多畅销书的作者,比如《Romeo and/or Juliet》、《生存还是毁灭(To Be or Not To Be)》、《万物发明指南(How To Event Everything)》、《恐龙漫画(Dinosaur Comics)》以及漫威系列中的无敌松鼠妹(The Unbeatable Squirrel Girl)等等。

游戏领域,我参与过《命运2》的DLC(Curse of Osiris)的创作和《Stick it to the man》,而且我也做过一些游戏研发,并不只是作为剧情作家。

Jon Manning:

很多对话工具都是以节点为基础的,每行对话都是图表里的一个节点,而且这些节点都是相连的,如果一个节点有多个连接,意味着这里是有选项的。这是绝大部分剧情设计工具的结构,你可以在资源商店找到。

还有很多工作室根据自己的需求打造了自己的工具,比如Obsidian的工具以及Double Fine的工具,这些公司都曾在GDC分享过他们的工具打造经验。

比如以上这些演讲标题,感兴趣的读者可以去回顾。

所有这些工具都是结构化的数据入口,我们可以将其称之为做对话设计的“图形”方法,这种视觉化的结构是很容易理解的,你可以从结构中得到很多信息。不过,这些图表做起来并不容易,因为有时候要从节点内外的视角进行切换,并且在不同节点之间划线,很容易搞混。

Ryan North:有一个比较好用的工具是表格,它适用于很多简单的事情,而对有支线的故事来说,这种方法就没那么有效率了。 我之前也用过这些工具,它们也能完成工作,但你总会想着:是否有更好的方法?

Jon Manning:有这样的方法,我们过去一直用两种方法替换,而不是单一的用图表或者表单方式做剧情设计,我们将两者综合,将对作家友好的电影剧本(screenplay)方式与对程序员友好的语言方式进行融合,我们打造了很多的工具,但需要声明的是,这是可以广泛应用的技巧。

因为,我们希望既有流控制,又让剧情写作更加简单。

剧情编程语言Yarn Spinner是什么?

Yarn Spinner是我们用了很久的工具,它是一个电影剧本工具和玩法脚本语言的结合,作为剧情作家,你可以直接写下对话,也可以做更多事情。

Ryan North:

很高兴你提到了电影剧本工具,我用过这样的工具。表单更适合比较线性化的剧情,尤其是在互动电影式的玩法当中。

不过,你会觉得,这是我们已经拥有的工具,它和我们用的工具没什么两样,他不是为了玩法而设计,而是为了电影剧本。

Jon Manning:从这个角度来说,Yarn Spinner还是一个完整的编程语言。

Ryan North:所以这就是比较有趣的地方,当你将剧情作家变成了程序员,这就是我们今天的话题。这就带来了非常有趣的工作流和能力。

Yarn Spinner并不是第一个创造剧情游戏编程语言的工具,游戏业最早从Infinity引擎就已经开始尝试这么做,比如《博德之门》就使用脚本语言来控制对话。Double Fine也在GDC分享过,他们在《Brutal Legend》和《Broken Age》也做过类似的事情。

不过,有时候你甚至连幻想都没有,我曾经用Word写过脚本,还用过在线文档,我曾在Google Docs写了整个支线剧情,并且标出了节点,这可能会得到非常混乱的结果,而且整个过程是非常痛苦的。

比如这张图片中,我是为一款游戏写的脚本,教授在使用她的黑板,但需要拷贝大量的东西,而且效率并不高,并不是好的工作流。

Jon Manning:

Yarn Spinner是一个开源项目,并且发布到了GitHub供所有人免费使用,它的灵感很大程度上来自Twine,最初是为《林中之夜》打造的。

Ryan North:Twine用起来可能会有些混乱,这是我的小说《生存还是毁灭》的截屏,你可以看到节点,但很难看出故事发生了什么。我试图用这些不同颜色的标记来解释故事阶段以及角色。

即便如此,我还是对它做了大量的简化,只留下了截屏和圈圈,看得出那个点代表了故事里的哪个部分。当你增加变量的时候,它只能变得更复杂,很多东西的追踪在这种视角下都是不可见的。

Jon Manning:Twine比较好的一方面是,它有非常简单的文本,即便是非全职编程人员也可以用,我们借鉴了这一点。所以Yarn Spinner使用了Twine一样的文本和电影剧本语义来创造信息语言。这里的文本和line是单句的对话,意味着电影剧本形成了Yarn代码。我们为选项设计了最小化文本,有流控制、指令,还有压缩系统。

我们说剧情编程语言的时候,说的是什么?

Yarn Spinner的工作流程是这样的:剧情作家将他们的对话写成脚本,你的对话会以Yarn脚本的形式出现在文本文件里,它看起来与电影剧本很像,非常容易理解。

编辑器工具阅读你写的对话脚本,并将其语义分析为不同节点,这就是我们之前说的图表上的单个节点。在游戏玩法期间,Yarn Spinner执行这个脚本,并根据玩家选择继续推动故事的发展。

比如这张图展示了《林中之夜》一个对话的所有元素,我们的话题可以拥有流控制,这里的输入值是角色angus,随后我们还对它增加了不同的数值。

指令是“关闭所有(close all)”,这是《林中之夜》特有的,意思是关闭屏幕上的所有对话。接下来是台词,这里我们选的是Angus与好朋友Bea的对话。最底下是选项,比如玩家可以选择Lasagna或者Brownies,然后会基于玩家选择运行不同的对话。

因此,Yarn Spinner运行起来就像是一个程序,实际上它就是个程序。

箭头功能是我们非常喜欢的,因为你不用创造节点然后用线连起来,这让支线对话做起来成本很低,意味着剧情作家写选项的时候更简单。

Ryan North:的确如此,它还可以让你在写剧情的时候快速实验,因为你可以看到这些选项需要什么,每个选项会带来什么结果,如果比较糟糕则可以去掉,对于剧情作家来说,它很大程度上是个实验场景。

Jon Manning:我们还发现它对过场动画也很有帮助,《林中之夜》所有的过场动画剧情都是用Yarn脚本写的,这对于解决非常线性化的内容输出是有帮助的。

比如在这里,除了执行对话台词之外,在这个脚本中我们还告诉喷泉停止播放动画,让音乐淡出3秒,并等待3秒钟,然后运行一些对话台词。

Ryan North:所以,当你写作的时候,就像是看到了播放出来的效果,让你可以聚焦于打造整个故事,然后将其他东西让开发者帮你在游戏里实现。

Jon Manning:故事语言就像是电影剧本和图表之间的中间点,你在编写一个线性的文本文档,这是很多作家比较熟悉的写作方式,但与此同时,你还在表达更复杂的支线剧情,就像程序员那样,而且,你在同一个地方可以做这两件事。

将作家变为程序员:Yarn Spinner是怎么来的?

所以,随着越来越多的人使用,我们将它做成了一个完整的项目,于是我们在想,为什么不为它做一款demo游戏呢?

Ryan North:这时候我加入了项目,Jon打电话说,要做一个5分钟的demo游戏展示Yarn Spinner可以做什么。

所以我写了一个提议“I feel fine”,讲述的是空间站机器人得知三天后空间站即将被其他机器人摧毁的故事,这是个非常简单的剧情、发生在一个房间里,你甚至不能移动,只能通过故事推进与角色聊天。

当时我跟Jon是这么说的,“你觉得怎么样?这些东西很多都是可以改变的,能否给一些可以迭代的意见,不需要有大量的对话,你想要从这个基础上得到什么样的结果?”

Jon给我发送了一个Unity应用,让我可以将脚本放进去,并让我告诉他最终得到的结果是什么。这是让我非常意外的,也很有趣,因为我可以直接开始写一款游戏。

你们可以看到,这只是一个很基础的demo脚本,这是角色说的话,底部是选项,中间是一些基础的控制。

Jon Manning:实际上,不仅Ryan感到惊讶,我也感到惊讶,因为我们给他的只是一个很简单的框架,他可以在此基础上写故事,可以复活、移动以及去掉一个角色,我们只是用了一天的时间打造,Ryan用这个工具做出了很大的项目。

Ryan North:没错,我很快做出了一个很多小时的脚本,而且有一个三天的故事架构,里面有多个角色结局选项,还有角色爱情故事,这个工具对我来说是非常好用的。

这是一部分游戏代码,如果仔细看,你会发现这与Jon最初发给我的结构很相似,只不过现在我们将它交给了真正的故事作家去做。

Jon给我的工具可以让我不断的重置故事,以便发现故事剧情和代码里的bug,并且成为了我写故事的工具。我请求他们给我发送支持不同变量的最新版本,以便可以像程序员检查代码bug那样,对故事更多方面进行检查。

这个工具的好处是可以快速写作,而且编辑起来非常简单,哪怕是在剧情写作的后期。我打造了一个三天架构的故事,并且只是在写作和试错。而且,它就像是一个可玩的文本编辑器,这是我很喜欢的,由于它是非常简单的文本文件格式,也非常便于其他软件的使用。

但它并不完美,因为Jon给我的这个沙盒并没有我想要的那么大,因为我需要变通才能完成一些工作。

Jon Manning:很多编程语言都是以主流特定语言的方式思考的,它们只能解决特定类型的问题。Yarn是一个为写故事而设计的特定领域语言,它在很多的剧情向游戏里比较有用,因为很多的场景,比如谁说了什么、做了什么,就是故事。

这就导致了我们的“剧情灰盒”,关卡策划们非常喜欢使用这类工具,他们可以在真正做关卡制作之前,通过粗略的形状与几何体测试关卡的可玩性。

在剧情灰盒中,作家们实际上可以控制逻辑,这对游戏剧情是非常重要的,因为它意味着作家们可以在需要的情况下打造自己需要的微型系统,而不必等待程序员来帮忙。对于程序员来说,这种方式也很有效,因为他们可以打造一个系统,然后增加易于替换的对话。

这个截图是《林中之夜》最初的脚本,其中很多东西都可以轻松替换的,哪怕是到了游戏研发的最后阶段。

这张图是《林中之夜》没有变化的结构,但很多内容是后来填充进去的,你可以在研发非常后期的时候补充这些台词。

Ryan North:Jon提到了剧情灰盒的概念,这实际上是在“I Feel Fine”的研发过程中自然而然发生的。我希望能够根据不同角色声誉的选择,可以有多种结局。所以我打造了一个非常简单的声誉系统,根据你谈话的角色解锁不同结局。

对我来说,根据自己的需要打造这些是非常简单的,不需要程序员的帮助就可以完成。

Jon Manning:

我们支持这种工作流动一些方法是,不需要执行大量的信息,台词只是不同的字符串,非玩家接触的任何东西都可以编码为话题标签,这非常容易写作,很容易理解而且非常直观。你甚至可以用表情符号控制角色面部表情。

比如上面这个场景。

我们还不用确定什么指令可以发送到游戏里,很多东西可以根据实时需要而打造,并且根据不同的案例使用通用语法“指令”。通过这个工具,作家可以在自己的脑海中为游戏写脚本,并且可以根据需要快速做出改变,如果有某个功能缺失,你可以很快自己写出来。

这还可以让开发者们不需要去解决有趣的问题,比如很多问题非常有趣、也很酷,但很难带来即时的用途。

它可以让开发者为游戏打造脚手架,给剧情作家简单的工具,但同时是个沙盒系统,让他们可以探索自己的想法,而且这还可以给出足够使用的代码,让剧情作家不会成为开发者,我觉得后者可能是有危险的。

这个工具不太擅长的是那些应该放在表格里的数据,特别是那些非常硬核的数据,它们放在Yarn Spinner当中会成为一团乱麻,所以最好还是放在表格中。

给工具开发者的建议

你该如何做呢?实际上,打造一个语法解析器比你想象的容易很多,因为它本质上就是用工具解决不同的问题,第一步就是打造一个工具,将脚本转换成语法树。第二步就是,你了解这个语法树,并且在工作的时候将数据发送给游戏,根据游戏状态跳过语法树的其他部分,这里非常感谢我的同事们。

我们使用了ANTLR工具,用来处理脚本语言的所有语法,它为我们向语法解析器生成源代码,然后我们将这个解析器用到Yarn Spinner的代码中。

ANTLR在编程领域是一个非常受欢迎的工具,它不是必备的,但我们发现很有帮助。第一个版本的Yarn Spinner并没有使用这个工具,但由于没有解析器生成器,结果是一团糟,有了解析器之后,它可以帮你避开很多边缘案例,节约很大的工作量。

作为一个工具开发者,你不需要解决每一个问题,很多问题是完全可以接受的,你只需要对它保持开放即可,这样你可以避免为很多设计问题打造专属的系统。

我们需要处理什么样的数据?根本不用在意,你可以将整个字符串发送到游戏,然后在这个字符串的对应地方找到任何需要的数据。

什么样的数据需要做成选择?不用担心,你可以将所有用户接触不到的数据转换成话题标签,它是一个字符串。

我需要将什么信号发送到游戏里?完全不用介意,你可以使用指令,因为很多字符串是玩家不用接触到的,让游戏去理解就行了。

所以我对工具开发者的建议是,不要试图打造一个完整的编程语言,你要做的不是给C#打造一个替代语言,只是为对话增加逻辑。Yarn Spinner不支持一半以上的系统语言功能,甚至不支持你自定义函数。

不要试图解决看似很有趣的编程语言问题,努力解决特定问题,作为工具开发者,你的角色就是做一个好用的工具,然后站到一边。

Ryan North:这个工具的好处在于,它可以让作家与开发者聚焦于各自擅长的事情,同时避免彼此袖手旁观,这可以带来非常简单快速的创意原型、剧情发展以及剧情测试。

因为我们也在于完整编程语言工具打交道,所以我们还可以通过它们的技巧探索更多的新领域。它可以让作家几天之内打造剧情,而且大多数时间只需要写作,而不是调整工具。一旦有了剧情,引擎就可以被加强,资源就可以放进来,随后,你可以根据这些输入很方便地调整剧情。

Jon Manning:我对这个方法非常感兴趣,而且它已经被很多的游戏使用,包括屏幕上的这些游戏。它有可能让剧情写作的速度跟故事发展一样快,对于非线性故事,它带来的帮助甚至更大,以上就是我们分享的全部内容。

如若转载,请注明出处:http://www.gamelook.com.cn/2022/05/482158

关注微信