提高游戏开发效率必知:程序自动生成场景应用

发表于2018-09-04
评论0 1.02w浏览
procedural generation,也就是程序化生成。广义来说,就是将原来人手制作的东西,交给程序算法去自动生成。

严格来说不能算新技术,但是近年却因为3A游戏的内容制作量爆炸性地提高,加上open world游戏的流行,而开始真正发扬光大。

其中又以Ubi最为精通,开放世界类游戏高产大王(也最常被人吐槽内容重复)

自动生成的范畴很多,涉及美术资源甚至音乐音效,但是以场景生成应用最为广泛,所以也集中讲讲这块。

(评论里有很多同学反馈,这里强调一下:通常大厂open world用的procedural generation,只是用来做辅助生成,不是100%从头到尾的自动化(下文也提到),毕竟这是不可能达到高品质的。而即使狭义上100%的自动生成,例如minecraft, no man's sky,也往往有一部分基础部分是人先摆好,然后再随机像零件一样拼装的)

+ 自动生成场景有多大意义?

传统的场景制作流程,都是人手工往场景内添加物件,对于2000年代的游戏来说,当时的地图不算大,细节也没今天那么丰富,所以人手制作尚且能够支撑。

但现在场景制作量多到什么程度呢?


枭雄还是12平方公里的伦敦地图,而起源是120公里的埃及(部分)。广州大学城跑一次内环也才4.5km。


像这样满街都是的民房,内部有:

-各种家具、物品
-墙上有破损
-有很多地方要标记能不能攀爬、攀爬点在哪
……

而这样的建筑,一个城镇有20~50座不等,而这样的城镇,在刺客信条起源里头光大城市就有5座,小的乡镇或者城寨更是到处分布。

你还不能都长一样(想想魔兽世界的人族兵营)

现在的开放世界游戏,物件数量往往都会百万级起步,并且为了尽可能呈现真实感,都要为每个地方尽可能增加细节(杂物、破损、表面凹凸)。这样如果全人手摆放,规模之大可想而知。

应用了自动生成的优势除了成本之外,就是可以大胆地提升很多东西的细节丰富度,比如far cry 5可以用比较低的成本就可以制作细节很高的山崖。


这意味着什么呢?

对于开放世界而言,最怕的就是玩家跑到一个地方发现没有内容。

以前这些山崖,只能作为一个远景看看,而现在即使爬上去你也会感到细节丰富,都是有相当逼真的碎石和植物,而不是光秃秃的贴图。(老滚爬山党路过)


另外,传统人工摆放,最蛋疼的,往往还不是产出第一版场景,而是策划要做修改的时候:

我的主角要帅气的从这个位置跑过去,把这个房子拆开,往两边挪一下,中间插个马路。

不够地方?想想办法嘛~

记得周围的花园还是要摆的漂漂亮亮的哦!

而自动生成意味着程序可以做到针对你新修改的内容,自动布置。

最典型的的就是在树丛里刷了道路,草丛会自动删除,同时周围的碎石还会好好看看的重新布置一下,以适应新的情况。

+ 主要难点

而这种制作模式也有很多难题,当然怎么解决这些难题就是自动生成的核心技术壁垒了:

1. 如何避免重复感

场景之所以可以自动生成就是里头很多东西确实很好规则化。

但是规则化最大的敌人就是重复感,人为描述的规则往往考虑不够周全。

著名的No man's sky其实在自动化生成上已经做到很不错的水平,但上市依然一边倒的差评,就是因为重复。除了玩法缺乏之外,另一个就是自动生成并没有真正给玩家带来不重复的体验。去到一个新的地方,植物动物造型变一变,颜色变一变,其他都差不多。

即使技术屌如Ubi也没能完全摆脱自动生成产生的重复感,但是随着他们不断实践,我们能明显感受到品质在持续提升。

怎么解决重复感是一个很大的学问,往往不仅仅是算法的问题,还涉及美术设计,基础资源积累,甚至游戏玩法设计本身。这里只是简单说一下要点。

首先,基础资源的堆积也是很重要的环节:要搞清楚,自动生成场景不代表不需要人工资源的堆积,也就是你想你的自然生态场景看起来丰富,你还是要先有足够多种类的树木、石头。

No man's sky的动物就是将头、身、四肢、小配件等模型分拆再按规则重组,加上颜色、材质的随机来做出随机感。其实这个方法很不错,但是因为原始资源实在不够,最多几十个星球你就会觉得毫无新意。而随机可选的东西多了,重复感才会相对减弱。

然后,是自动生成选择的随机维度,要尽量容易产生有意义的差异化。比如生成动物,虽然靠部件换色能够轻松组合出几百个能看的组合,但是往往没有人会觉得里头有记忆点,从而感到烦厌。而相比之下,体型、夸张的形状,会更有记忆点。另外,用人的设计在里头做干扰,也是很重要的环节,比如加上生物的行为,行为与玩法又要关联。玩家遇到一些动物有变态的行为组合(能喷火又跑得快)

最后,就是算法产生的东西的随机性要符合自然的感觉,这个就要看具体的情景,例如树和灌木怎么混搭,怎么选择位置,怎么加杂色和大小变化,这些就不再赘述。

2. 针对不同的物件/情景设计合理算法

目前自动生成并没有非常通用的方案,基本上针对不同的物件都要设计不同的方案,大到产生山谷河流,小到种树放石头布电线。

同样布置石头,在山壁上和在平原上不同,山壁需要考虑斜率,考虑山壁的材质是不是石头,平原上则考虑随机分布的合理性和去模式化感觉。

模块化建筑合成,不同的建筑风格可能都会有不同的思路。

而针对不同的游戏,这些方案往往还要跟着游戏的一些细节做调整,比如有些游戏要能攀爬,可攀爬的部分就要针对做设计。

当然,随着这些方案的持续积累,这些技术最终都会变得越来越全面和通用,毕竟常规题材还是有限的。

3. 与人工布置的结合

目前还不可能做到从头到尾都让计算机生成场景(不然很多人要失业了),所以实际制作过程中还是需要大量的人工参与。

那么一方面,随机算法不能破坏人制作的东西,比如你布置了一条路,算法就不能再上面放一棵树,如果之前已经有一棵树,自动生成还要会删除它。而这个事实上比想象中还要复杂,例如AI的巡逻路线可能被自动摆的物件挡住、程序设计的规则可能没有考虑到特殊情况导致某个角落出现不正常,GDC2018上刺客信条就分享了测试团队怎么用自动化的思路来发现自动生成和人工内容相冲突的问题。

另一方面,人还要能引导算法去遵从设计师的思路。例如策划可能会想为自己的玩法设计地形(区域大小、关键路线、关键物件等),自动生成还要考虑如何配合人的想法,而不是胡乱生成一堆随机但是完全不搭的东西

这里说两种常见思路:

3.1 人工布点、曲线、面,然后算法大规模生成

简单说就是,美术和策划布置比较少的点或者线作为引导标记,来引导自动生成算法应该在哪里布置相应的东西,剩下的事情就是交给算法去生成,并且保证生成的东西符合这些引导标记。

举几个GDC分享
far cry5:
https://www.gdcvault.com/play/1024029/-Ghost-Recon-Wildlands-Terrain 

这个分享非常细的讲到以自然环境+城市fps为基础的这个大框架下各种东西的自动布置,包括植被、山崖、碎石、电线、地形、河流等等,还应用到了houdini(其实也可以自己写随机算法,但估计是想使用houdini里头各种现成的solver用来做生成算法)



刺客信条枭雄:伦敦不是一日建成
主要介绍街道、建筑的生成
https://www.gdcvault.com/play/1023305/-Assassin-s-Creed-Syndicate 

3.2 基于笔刷

地平线:基于GPU的自动物件布置方案
https://www.guerrilla-games.com/read/gpu-based-procedural-placement-in-horizon-zero-dawn


这种方式在更加适合美术和策划需要仔细定制地图细节的情况。

相当于程序开发了一个很强的地图刷,这个刷可以根据美术策划的需求配置成几种分类:道路、树1、树2、杂物。

然后你就只管往上刷,程序会自动帮你按照合理的规则(当然需要程序/TA帮忙定制)放置这些东西,例如保证路和斜坡上没有树,保证树与树之间密度合理,保证树下有合理的灌木草丛覆盖,等等。

相比大规模生成,这种方案可控程度更高,美术策划很好控制细节,当然也意味着更高的人工参与量(刷漆工还有码农)。

另外这个思路现在在UE4/unity里也能实现,并且市场还有几个实例方案(例如landscape auto material),虽然这些实现的性能比较捉急……还没有达到地平线这种产品化的程度,但不失为一个很好的思路参考。

随着现在AI发展,未来自动生成这块肯定会越来越强大,大厂和小厂在这块的壁垒差距会越加明显,但是玩家未来也能够更容易相守到更高品质,细节更丰富的,内容量更大的游戏。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引