独立开发者分享:适合所有人用的程序化自动生成技巧

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

GameLook报道/在游戏行业,内容制作是所有开发者都会遇到的难题,尤其是中小团队。不过,在程序生成(PCG)的帮助下,即便是单枪匹马的开发者也能批量制造大量内容。

然而,PCG并不是所有人都擅长的,甚至很多人会觉得不少生成器没那么好用,就像是淘宝买衣服的时候非常高大上的“卖家版”,到了自己手中就成了完全不同的“买家版”。

那么,PCG该怎么做才是对的?在此前的GDC演讲中,独立开发者Kate Compton根据自己15年以上的程序化生成从业经验,分享了一些比较实用的PCG技巧,希望帮助所有的独立开发者都能高效率制作大量优质内容。

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

Kate Compton:

我们今天主要说的是PCG(程序化生成)技巧,为什么你需要它们、做这些需要什么代价,以及它可以带来什么优势,我还会将一些“PCG MSG”,一些简单的提升方法。所以,这个演讲适合所有想要在游戏里增加程序化生成内容的开发者。

介绍一点我的情况,我从事程序化生成超过15年了,我在《Spore》、《模拟城市》(还有一些被砍掉的项目)做了5年,用了5年的时间拿到了生成游戏和创意工具领域的博士学位。我还做了大量的PCG机器人和创意工具。

去年的时候,我还做了Tracery教人们如何学习和实用PCG,总的来说,我做了大量的程序化生成工作,比如图中这些都是我做的奇奇怪怪的东西。

在2015年的时候,我写了一篇程序化生成器的博客,收到了大量同行的回复,很多人都在问怎么才能给游戏快速做程序化内容、如果想要开始做PCG使用什么工具?这篇博客写了4个小时,很快超过了4000个单词,很多人觉得它很有用。

所以,如果你对演讲内容不知所措,可以去看这篇博客,里面有今天说到的所有东西,而且是慢节奏的。

游戏行业当中,有《我的世界》这样生成地形的游戏,有《无人深空》这样生成不同事物的游戏,还有《矮人要塞》这样生成醉猫的案例,甚至还有很多没那么出名的独立游戏也在用PCG生成游戏内容,甚至有些时候,程序化生成器还可以生成游戏规则本身。

你甚至可以生成非游戏内容,比如生成衣料和时尚以及其他项目。

我还用机器人生成了一件裙子,这件裙子虽然没有上架销售,但依然是不错的裙子。

还有来自音乐行业的人通过生成器打造游戏,还有些项目是半游戏半创作式的平台,人们在使用生成器做诗歌、音乐甚至是鸡尾酒的生成,你们可以在ICCC International Conference on Computational Creativity大会官网看到更多相关的信息。

你可以做各种各样的程序化生成,大的物体、小物件,简单的东西、复杂的东西,程序化生成本身给人的感觉是很酷的,所以,PCG没有错误的做法。

大量的生成内容使用了极为复杂和聪明的AI,即使如此,依然有很多这样的游戏失败。实际上,很多成功的程序生成都是非常简单的,所以不要过于复杂,有些时候,最难的部分是想法,也就是内容的设计。

如果想要做程序化生成内容,这些步骤是正确的:你要理解游戏设计领域,列举你的限制、理解程序生成过程,挑选一个通用的方法,最困难的部分是迭代并保持灵活,很多大公司都会在这个阶段栽跟头。

在做《Spore》的时候,我们工作非常努力,用了数年的时间打造这些程序化生成器,随后发现根本没有时间进行迭代。即便是用了5年的时间,你把所有的技术都做了出来,但你不会像独立开发者那么灵活,有时候甚至会盲目跟从PCG生成器带来的结果,而这往往会导致一些看起来很蠢的结果。

你首先要确定要做的是什么,这个阶段越具体越好,因为你越是清楚自己要做的是什么,就越容易做更好的生成器。我做不了一个小说生成器,但可以做一个爱情故事的程序化生成工具。因为后者有更多的限制,我能够开始描述自己的要求,但没办法描述一部小说。

做《Spore》的时候,我们把这叫做“制作盒子里的艺术家(Making an artist-in-a-box)”,因为你在培训并且命令他们如何做艺术,所以你必须向他输入你的艺术观点,然后通过它在游戏里实现美术创作。

当时我们招聘了一位迪士尼动画师,让《Spore》项目的生物创作策划与他聊了很长时间,比如,如果你要设计一个生物,你会做什么?他们并没有直接采取任何答案,而是按照他的思维方式不断深入了解,然后做出了右边这些生物,并且放到了游戏当中。这些生成的生物都非常不错,因为他在这方面是个专家,而我们做的生成器反应了他的做事风格。

今天我们还会说一些加法和减法,比如你要打造一个有很多好东西的空间,去掉不好的东西,这里会有一些可能空间,比如这个空间里有多少东西;还有一些表达范围,比如这些东西事多么有趣。

第一部分:程序生成的“宜家目录”

1.加法

生成方法的所有目录以及为什么你可能选择每个方法,这里有6类方法。你们可能会注意到,PCG往往会做到非常神奇的事情,我们可以向你展示很多闪闪发光的内容,你可能觉得我们的小屏幕上的东西非常神奇,但你自己做的时候却没办法实现。

实际上,很多都是比较简单的,尤其是基础案例方面。你可以打造非常简单的东西,没有必要做的太复杂。

第一种是Tiles,比如《暗黑破坏神2》当中就有很多的Tiles,通过Tiles你可以把某些东西划分到多个区域,而且Tiles的放置不会受到限制,你可以加入实时内容,不用做更复杂的东西。

其次是语法,这也是我最熟悉的领域,你可以用它从其他事情递归得到新的事物,比如我就用Tracery做了很多的PCG故事,假设我用这个生成器做了一个科幻故事,然后我们将科幻故事的不同部分进行拆分,你可以不断递归定义很多东西,最终往往可以得到很多可以复用的模块。

我提到过《tracery.io》很多次,不过还有一个想要分享的是,你还能够用语法设计一些情景化的免费美术素材,比如这些摇曳的植物,就是通过语法定义的。

Distribution可能是所有人都经常使用的PCG方法,你有一个关卡,它里面有很多东西,然后你把这些东西按比例分布在关卡中。你可以使用随机数字,但实际上,真正的随机看起来并不好,给人的感觉会很奇怪。

所以真正的distribution是有序的,还需要维持空间感,即便是我们做虚拟花园的时候,我们也保留这种方式。比如下图是一个日本的花园,它的树木大小、岩石分布都很奇怪。

所以在做distribution的时候,我建议你向美术总监提三个方法,第一个是Barnacling,意思是,如果游戏里有非常大的物体,最好是在其中设计一些中等大小的物体,有时候可以是同样的东西,有时候也可以使完全不同的东西。比如左侧的纪念碑就有树木作为衬托,让它看起来很自然。

第二个是footing,当两个物体互动的时候,你要让玩家看出来他们在互动。Greebling是一个来自星战的术语,因为卢卡斯设计了很多不同的纹理,比如一个装了很多东西的箱子要和其他闪亮的东西相撞,所以这就叫Greebling。

如果要做好distribution,我建议你可以使用这些方法,不过我比较懒,就不逐一读出来了。

Parametric是一个非常有趣的方法,因为你可以用它做很多事,很多东西都可以与其他混合方法结合起来。

这是我做的一个Parametric生成器,你可以通过左侧的数值改变花朵的绽放范围、颜色变化,它们由32个指标进行定义。

我还用它做了一些“变形手柄”,《无人深空》的开发者可能会对此比较熟悉,因为我注意到这款游戏里有大量事物都是通过Parametric方式生成的。

你可以用在任何地方放置一个有效的手工艺品,还可以做遗传算法,或者对这个空间重新布局。

Interpretive是非常酷的一个方法,你开始用一些输入,运行一个算法把一些数据处理到另一些数据当中。

不过这很容易将简单的事情做的复杂,比如右侧是《Spore》里一个生物的制作流程,红色的点事玩家真正可以做的,左侧是我们的生成器编译出来的生物。

实际上,当我们做身体或者手部追踪的时候,会得到大量的动态数据,对于这些数据,你可以用不同的方式理解,比如右侧就是《Spore》一个生物的制作流程,我们先做了骨骼架构,然后用metaball做UV贴图,我们做了最右侧的动画和左侧的绘画,最后做出了一个生物。

可能没有任何一个美术师能够把人体所有部位都画出来,但你可以用数字“画师”做到,还有《Pokemon Go》里的真实世界地图或者是AR环境里的卧室,你该如何装饰这些房间?Interpretive就可以帮你解决问题。

实际上这个方法还有很多的案例,但由于时间关系,我们不会深入探讨,比如Perlin Noise,几何学。

我用这个方法为一个太空游戏做了地图,还有一个外星人主题的游戏也用了这些技巧,比如Voronoi/Delaunay,它们可以找到这些相近的区域,然后找到这些区域的连接,因此可以更快速做地图。

还有些案例是用分形,比如《Hypernom》和《Miegakure》就用程序生成的方式做了很多有趣的不可能形状。

模拟

我个人非常喜欢颗粒和颗粒模拟,比如通过颗粒模拟我可以做出一个花朵生成器,在《Spore》当中,我们也用颗粒模拟做了很多的纹理,然后拖拽河流背后的纹理,它就可以变成一个星球。

还有细胞自动控制器、代理模拟以及物理模拟等方式,用它们也能生成大量的内容。

2、减法

你用上面的方法做了大量的东西,有些很好,还有些不那么好。

保存种子数据

上面提到我们研发《Spore》的时候没有时间做迭代,我用的一个应急方法是,在测试中一旦处于良好的状态,这时候就存储一些种子数据,如果用同样的随机数字,就可以生成同样的内容,这可以节约大量的时间。

不要试图把所有事做正确,只要找到行之有效的方法就可以。

还有一个方法是生成并测试,如果你可以写一个算法来判断PCG内容质量,那就可以直接扔掉很多东西,而不是做优先级选择。需要注意的是,如果你把这些内容的顺序排的很松散,但限制很高,那么很可能做不出高质量的内容。

你还可以通过计算方式探索可能空间,又叫“搜索”,你可以蛮力搜索,比如找到这个生成器可以做的最高的东西是什么,或者搜索大量的关卡,找到最好的那一个。当然,还可以用爬山式的做法,不过这时候与Parametric配合最好用。

有一个方法叫做解决限制,你们可能听说过IK-solving。右侧是我写的一个谋杀谜案的生成器,比如有些人所爱的人陷入三角关系他们就会嫉妒,这时候就有谋杀的情绪动机,那么,在15个人当中,5个人有这样的动机,其中一个实施了谋杀。

这里的解决方法是,永远不要写自己的答案,如果你这样做,很容易让你的独立游戏永远发布不了。

第二部分:充分利用程序生成

经过了上面的方法之后,你做了一个可以生成大量优秀物体和范围的生成器,这就意味着你赢了吗?

当然不是。所以要充分利用PCG生成。

比如你用生成器做了大量独特的事物,他们每个都是独特的,但玩家们并不会这样理解,我把这称之为“1万碗燕麦粥问题”,Michael Cook在这方面做了非常不错的讲解。

不同类型的生成内容

不过,有时候大量的物体不会有问题,程序生成的内容有很多,有些是用在背景中的,如果你生成了大量的树木,那么它们有一些相同也并不是问题。

有时候,你可以用感知差异和感知独特性来设计程序生成内容,比如这个电影中的一个场景,可能很少人注意到里面有不少人是重复出现的,但这时候你的注意力就聚集在这个红色连衣裙的女人身上,很难发现周围的有些人是重复出现的,这就是用感知独特来弥补感知差异一个非常不错的设计。

归属感

归属感很重要,比如你做了一个非常大的可以拓展世界,玩家们到了一个地方、发现了一些东西,要让他们可以对这些东西命名,这样他们就可以走到朋友面前说,我发现了某某事物。《Spore》在这个方面做的就不错,比如玩家远足的时候给他们奖励,他们甚至能将这些送给朋友。

《矮人要塞》在这方面也做的不错,比如玩家可以自己发现有趣的内容,他们甚至可以分享自己发现的故事,让其他感到好奇的人也去探索。所以,让你的玩家成为游戏里的创作者、推广者和讲故事的人。

数据结构

最后是数据结构,这会让你的工作更简单。

我做了一些A/B测试生成器,以便让新生成内容更加安全。比如Tracery生成器的Json版本,你甚至不会觉得它很重要,但json是非常稳定的语言,我刚刚发布Tracery的时候,就有人发现了漏洞,还有一点就是让你的生成器视觉化。

以上就是今天的内容。

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

关注微信