1

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

 2 years ago
source link: http://www.gamelook.com.cn/2022/02/471546
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

2022-02-14 • 开发程序开发

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

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

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

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

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

lazy.png

Kate Compton:

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

lazy.png

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

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

lazy.png

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

lazy.png

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

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

lazy.png

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

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

lazy.png

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

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

lazy.png

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

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

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

lazy.png

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

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

lazy.png

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

lazy.png

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

lazy.png

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

1.加法

lazy.png

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

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

lazy.png

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

lazy.png

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

lazy.png

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

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

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

lazy.png

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

lazy.png

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

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

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

lazy.png

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

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

lazy.png

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

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

lazy.png

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

lazy.png

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

lazy.png

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

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

lazy.png

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

lazy.png

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

模拟

lazy.png

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

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

2、减法

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

保存种子数据

lazy.png

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

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

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

lazy.png

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

lazy.png

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

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

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

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

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

lazy.png

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

不同类型的生成内容

lazy.png

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

lazy.png

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

归属感

lazy.png

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

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

数据结构

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

lazy.png

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

以上就是今天的内容。

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK