前言
本文观点仅个人经验以及想法,分享给大家。
不要再浪费时间在纸面上的设计与规划了,已经2023年了,这样做效率不高,且没有意义。
在设计开放世界地图的时候,一定不能在开始就过多的关注于局部细节,放弃以前设计箱庭关卡或者CQB关卡的经验。开放世界地图,我认为,讲究的是:①代入感 ②规划是否合理 ③是否符合玩家对于无论是现实世界的认知,还是对游戏幻想的认知。在具有代入感的前提下,玩家会根据自己对世界的认知,自发地找到游戏的乐趣于策略感,就像小时候和其他小朋友玩枪战一样,自发地投入进去,找到优势地理位置或者符合自己策略的位置。
与设计CS之类的游戏地图不一样的是,由于CS这类游戏,一直重复在有限的区域,所以游戏的乐趣在于熟记地图线路,以及遇敌节奏,游戏在设计者精心设计的每一个环节中。而开放世界游戏不一样,玩家所遇到的游戏事件包括战斗将会发生在开放世界的任意一个角落,玩家的游戏乐趣在于如何快速的在开放的环境或者陌生的环境找到适合自己的玩法,是一种探索感,一种新鲜感。
设计思路应当建立在分层递进的基础上:宏观框架→区域划分→路线设计→局部设计→挑选几个重点局部着重细节
在设计开放世界地图,如果过于拘泥于局部细节,那将会把这个工作变成一份不可能完成的任务,应当多采用PCG工具,无论是地形、街区还是植被。
==================================
=本文所涉及的工程,我一个人花费不到2个小时完成。=
==================================
设计地图宏观样貌
我现在Photoshop中,随意画了一下我设想的地图框架。游戏设定在一个海滨发达城市,北方的气候,没错,就和我的家乡大连一样:P。
这里有一个关键的一步——决定地图的尺寸。
我能想到影响地图尺寸的因素有:
①角色、载具的移动速度,从地图的一端移动到地图的另一端需要多少时间,从玩家的据点移动到Quest Point所需要的时间
②Quest Point的密度,数量
③Interactive Building的密度,数量
④城区与郊区的比例,城区的数量
下一步,我把这个地形给雕刻出来
和我最初画的差别还挺大的,不过没关系,不要纠结这个,反着也没啥意义。
地形的雕刻,使用的是Gaea,之后我可能会出一个详细的教程如何使用这个软件,还是蛮方便的,雕刻这个地形总共花费5分钟,都不到……
做一些简单的规划
这里做了一些简单的规划,这一步规划决定了:
①一会在UE5中怎样进一步的施工
②日后玩家在游戏中以怎样的一种密度,节奏去玩游戏
因为玩家的主线还是靠任务来驱动的,所以
③一些“郊区”的任务点设置,也会影响玩家在游戏中体验怎样的游戏风景。
④同时这些风景和远郊的线路也起到了玩家紧张情绪的调剂作用。
如上图,我规划了临海的一片主城区,临近的一片副城区,以及一片离岛区。
玩家的据点将会设置在内陆的副城区,随着任务的推进,会逐渐的迁移到临海城区,离岛区,以及郊区。这样在推进主线的过程中,也会在关卡方面逐渐的给玩家带来新鲜感。
另外,在做规划的时候,应当尽量避免“对称”的规划,因为这大概率不符合玩家对现实世界的认知,所以我在规划城区的时候,重心都是偏向西北面的。
这一规划也比较符合正常玩家对一个城市的认知,临海的,平坦的区域作为城区。褶皱的区域作为郊区。
导出到UE5
在我之前的一篇教程里面有介绍过,如何通过Heightmap,把UE外部的PCG制作工具(World Creator)做好的地形导入到UE中。
Einsphoton:策划也能快速上手的程序化生成原创大世界地图手段——共同创造国产AAA游戏
使用Gaea也是一样的,最终都是要导出Heightmap,然后再导入到UE中。
这里省略了一步,就是在Gaea里面使用程序化生成的手段,将地形染色,然后再导出Heatmap。这样就可以很方便的在UE中快速生成地形贴图。这个等以后我单独出一篇Gaea的教程再说吧。
感叹一下,UE5的World Partition整体体验比UE4的World Composition好太多了!
程序化生成街区
这是最重头戏的一幕,也是大家对GTA这类游戏关卡最关心的一个模块。如果没有相关PCG工具的话,制作成本将会是一个恐怖的数字。
这里选用的是:Procedural City Creator Tools
整体感觉很不错,全部都是蓝图脚本制作的,里面有大量的Editor Script(原Blutility)
缺点是:贵,目前只支持平地。从目前的销量来看,估计后续更新的动力……
但是依然会为我们解决大问题。因为其支持自定义建筑模组,整个街区规划也很不错。
另外,我看UE5.3的Roadmap,貌似Epic要出自己官方的相关工具了
所以我估计这老伙计后续更没有动力继续更新维护了……所以你懂得……
Step I:创建城市区域
-在ProceduralCityCreatorPCC_Module目录下找到蓝图PCC_City_Zone
-把它拖进关卡中,你会发现它的核心组件就是一个Spline,你需要做的是,添加多个贝塞尔节点,然后用贝塞尔曲线围城一个区域。
-这里需要注意的是,不需要手动闭合曲线,只需要在属性面板中找到“Close Spline”然后设置成True,就可以自动闭合曲线。
-紧接着,我们找到“Linear Shape Optimization”这个属性,自己tweak tweak,观察紫色曲线的变化。
-紫色曲线是实际上城区的区域,但是作者推荐“没必要那么贴合白色曲线,所以尽量保证这个数值小一点”
-如果你想要让城区按照白色曲线来生成,也是可以的,只需要设置“Use The Main Spline As Zone Shape”为True就可以了。但是要注意的是,白色的是Curve,literally,而紫色的是方方正正的Linear。
Step II:创建单元格
-这里面,单元格指的是多个地块再加上四周的街道
-在属性面板上勾选Cells分栏下面的Preview Cells,就可以看到单元格了,可以通过Cell Size来调整单元格的大小。通常需要取消这个Actor的焦点,再点一下,才会刷新。
如果你地图小的话,你会发现,你围的这片区域都盛不下一个单元格
这个时候你可以修改一下单元格大小,这里我示例一下缩小1倍的效果
但是需要注意,不能缩的太小,毕竟这一个单元格可能涵盖了多个地块以及多条道路,这些资源也有自己的大小。
Step III:添加高速公路
高速公路是一个城市的灵魂,规划好高速公路,有助于让城市更加逼真。并且高速公路也是连接片区的重要通路。
-在PCC_Module文件夹下,找到PCC_Road_Spline蓝图,添加到关卡中,按照个人需求,添加多条。
-添加好后,在Actor_PCC_Road_Spline的属性面板中,找到Road Type,选择Highways
-这里需要注意一下,如果选择的是Highway,则目前版本最多只支持两个贝塞尔节点,也就意味着,只能是一条直线。
-想我这样,生成多条高速公路,需要注意,高速公路必须要穿过整个城区,这样城区在生成的时候才会参考高速公路来做动态的改变。
-高速公路同样也可以高度制定,关注一下Road Mesh、Bridge Mesh以及Data Setup这几个属性。
警告:这里需要注意一点,如果你打算复制Actor,这就很危险了,需要关注一下属性面板中“Don’t Touch”分栏下,有一个Road Name Tag属性,看一下是不是和其他Actor重名了,如果重名的话,需要点一下“Has Already Set Name Tag”生成一个新的名字,不然会有严重后果。
Step IV:添加河流
同样的还是使用PCC_Road_Spline,不过这次我们把Road Type切换成“Spline curves”
这样我们就得到了一个以完整的Spline为核心组件的Actor,通过编辑贝塞尔曲线来形成河流
编辑好之后,还需要配置一下Mesh以及Props
Step V:生成单元格
在Outliner里面找到PCC_City_Zone实例,然后在属性面板的PCC Command分栏里面找到0-Spawn Cells按钮,点击生成单元格
会发现,它会按照我们之前摆放的高速公路,动态的生成了一系列的单元格。
观察发现:
-绿色的格子,就是单元格,将来是用来生成若干个大楼地块用的。
-红色和紫色的线,则是马路,并且这些马路也动态的把单元格分割了。
-这个时候,黄色的曲线(河流)还没有分割单元格,但是未来,它会把地块分割掉。
-然后就是外围一条很粗的白色线,外面包裹着蓝色的Capsule,就是整个城区的形状。
Step VI:预览道路规划
点击任意一个生成好的单元格,然后在属性面板中找到“Activate Construction Script”,设置成True。
就会看见道路规划的预览
你会发现,这里有三种颜色:
-白色:代表X轴的路
-黑色:代表Y轴的路
-黄色:代表与河流交叉的路
有时候在编辑其他小的单元格的时候,你会发现没有任何道路规划预览,这是因为这个单元格太小了,而设置里面的道路又太长所导致的。所以这个时候,你需要在属性面板中,编辑道路的长度:
X轴与Y轴各一个数组,作者的说明书里面并没有详细给出这个数组的作用,我大概看了一眼脚本(里面内容实在太多了,眼花缭乱),在生成道路的时候,会在单元格空间里面遍历这个数组的所有元素,来看是否有一个长度合适安插在某个位置。既然这样,那理论上来说,你给这个数组添加更多的元素,可以使你的街区生成的更加整齐合理一些。但是切记!不要设置的过短,否则地块则会变得很小,到时候只能生成一些小块草坪+一个长椅啥的,没办法生成大面积的高楼大厦。
对于其他参数,有:
-Randomize:搞一次随机,如果你对现在生成的不满意的话
-Road Rotation:允许生成道路的时候稍微旋转一下
-Road Offset Size:允许你设置多大的偏移
-Offset Frequency:决定有多少道路会被这个偏移所影响
-Road Offset Type:设置偏移类型
-Probability to Remove Roads On X/Y Axis:删除X/Y轴道路的随机概率
自己多动手摆弄一下。这个是我调的数值,感觉还不错:
观察上图,你会发现靠近河流的部分,预期上本应该生成道路的,但是并没有。这是因为河流与道路交叉口交叠了,导致河流自动把交叉口以及相关的道路删除了。
如果仍然想要在河流旁边生成不受影响的道路,可以找到河流的曲线,然后在属性面板中找到“Curved Path Deletes Overlaped Roads”,设置成False即可。
Step VII:生成街区地块
我们现在Content目录下创建两个文件夹,“PCC_Baked” 以及“PBG_Baked”用于储存烘焙好的Mesh,其中PCC_Baked我们接下来就能用到,需要配到PCC_City_Zone的AssetPath属性中。
然后直接在单元格Actor的属性面板里面找到PCC Command分栏,然后点击按钮“0-Spawn Cell Contents”
瞬间,街区就生成好了。
可以关注一下生成的都有哪些东西:
-大片各种形状的地块,用于生成建筑、公园以及各种城市Props
-马路、桥、Props(路标、树、人行横道,红绿灯),以及十字路口融合Actor,用于日后融合交叉的马路。
Step VIII:烘焙道路Props & 融合道路
选择任意一个PCC_Road_Spline Actor,找到属性面板中的Bake Road Props按钮,点击即可烘焙Props。
你也可以选择所有的PCC_Road_Spline Actor,然后一起点Bake Road Props。
接下来,我们就要融合所有道路了
首先我们需要在PCC_Widget文件夹下找到一个叫PCC_Main_Widget的Editor Utility Widget蓝图,右键,点击“Run Editor Utility Widget”
打开一个新窗口里面,有一个滑动条,滑到最右侧,找到Bake工具集,然后点击最下面的按钮“Click To Bake Road Mergers”
点击之后,这个脚本会自动融合所有在单元格之内的Road Merge Actor,并保存到PCC_Baked文件夹里面。
操作前操作后
但是你会发现一个奇怪的现象,为啥与单元格边缘交叠的Road Merger Actor没有被烘焙。不要着急,因为流程上还没到那里,还记得之前我们单独生成的高速公路么,那个不是也还没有生成么,等到他们生成了之后,在烘焙就完美了。
Step IX:预览地块内容
接下来要进行最令人激动的一步了。
我们先来一个直捣黄龙!
点击任意一个PCC_Plot Actor,然后在属性面板里面找到“Real Time Edition”,然后设置成True,看看会发生什么?
细节
这个地块会生成一个预览,生成的内容都是临时的。我们还可以点击下方的Random All,来重新生成一套方案,如果你不满意的话。
除了Random All之外,你还可以试一下:
-Randomize Buildings:只随机建筑的Mesh
-Randomize PSB Shapes:随机PSB,可以产生更多的建筑变化
-Randomize Props:随机各种小物件
-Randomize Ground Material:随机地块的材质
现在生成的是PSB,先不要着急,后面会有流程把PSB换成正式的Mesh。因为PSB(Procedural Spline Building)是很灵活的,可以塑造成任意形状,所以初期阶段以PSB来代替生成建筑,可以创造出更多的发挥空间。
另外,从脚本上来看,地块面积越小,越不容易生成大楼,只能生成一些公园和寥寥Props,所以当初在规划地图的时候一定要多加注意!
对于Spawn Algorithm这一属性,大家也可以多动手尝试一下,里面总共有这几个类型:
-Edge Based:沿着地块边缘生成一些建筑,理论上可以达到这样的效果:
但是如果你的地块太小的话,就会变成这样:
-Area Based:生成大楼Mesh来填充整个地块,你可以通过设置Building Area Gen里面Global Buildings Chance来改变建筑密度。同样展示足够空间下的理论效果:
-Grid Based:以阵列样式里生成大楼Mesh,填充整个地块。阵列的大小可以通过Buildings Grid Gen下的Grid Size X以及Grid Size Y这一属性来修改。注意Use Custom Grid Size要设置成True,不然阵列的大小将会根据最大的大楼Mesh维度来进行计算。
-Car Parking:生成停车场。
-Free Plot:无大楼模式
Extra Step:地图玩法规划
关于Procedural City Creator的讲解我们先暂停一下,因为再做下去,会和我们初衷发生冲突。
我们是希望做一张GTA样式的地图,那么问题是,不可能地图上所有的内容都靠程序化生成来解决吧???生成的内容全都是不可交互的。
所以我们要做一下关卡策划该做的工作——提前规划好地图。
这个工作如果要是我来做的话,我会按照这几个维度来开展:
规划地标建筑(Landmark Buildings):主要承接的作用是,帮助玩家快速熟记大世界地图,不迷路;然后是好看;再然后可以承载一些任务,充当Quest Building作用。
可以看到我在地图上规划了摩天轮、跨海大桥、CBD、庄园、农场。这些Landmark设计思路需要根据你游戏里面的任务剧情需要、世界观背景需要,最后再参考是否贴合现实认知,以及是否好看,容易被记住。
规划任务建筑(Quest Buildings):玩家的据点、任务目的地、关键NPC所在场所、副本关卡、剧情承载等。规划这类地点的时候,要时刻注意游戏节奏,以及营造玩家情绪变化。
其中:
主角的家:选择的是城区里面一个不起眼的角落,比较贫穷,这样才有故事讲。家里面会有很多游戏系统功能,以及也会发生一些事件。
据点:任务的集散地。这里多数都是承接任务用的。和剧情发展紧密联系。至于其他分支任务,可以不用布置在据点这里。
任务目标点:规划的这些点不代表游戏中全部的任务目标地,只需要关注,有强烈的特殊关卡制定区域,以及有额外的游戏交互区域即可。
设计依据大概分为这几个原则:
1.任务点的密度
2.游戏节奏
游戏初期的时候,主要任务点比较建议设置在主角的家以及第一个据点附近。随着游戏进程的推进,逐渐的驱使玩家去探索地图中不一样的角落,也就意味着不一样的风景。
一些比较重大的任务,比较推荐设置在偏远的郊区。一来,可以在进展刺激的任务之前,给玩家一段舒缓的旅程,沿途还可以欣赏一些风景;二来,一些突破大尺度刺激的场面,就是比较适合在郊区发生。
3.任务点是否能融入到地图,例如,在农场就应该发生一些和农场有关的事件;黑帮幕后最大的BOSS应当安排在有山有水的庄园里;帮派交易通常发生在港口等等。
注意:设计了任务建筑规划,不代表游戏人物只能发生在这几个点。而是这几个点可以有更大的游戏交互空间,所以我们预留了这几个位置手工制作关卡与逻辑交互Actor。
规划可交互建筑(Interactive Buildings):商店,加油站,维修站等等。
这里我就不再画图了,因为这个比较简单,唯一的设计依据,就是注意密度以及游戏节奏(比如说警察追逐战里面,是否要有足够的汽车美容院)
Step X:正式生成地块内容
我们继续回到Procedural City Creator,上一个环节我们调了很多参数,如果遇到满意的效果,就可以直接点击属性面板中的按钮“0-Spawn Plot Contents”把这些地块上的内容做实的生成出来。
然后你也可以批量生成
是不是有点像模像样了?这还不够
接下来我们要给大楼进行“贴膜”了,找到PCC_Widget文件夹下的PCC_PSB_2_PBG_Widget蓝图,双击打开,然后找到Prefab_List这个变量,修改一下默认值PBG_Prefabs_List_Data → PBG_Matrix_Prefabs_List_Data,然后点一下编译,再关闭窗口(保不保存无所谓,最好不要保存)。
再右键这个蓝图,选择“Run Editor Utility Widget”
-Spawn PBG for Selected PSBuilding:只生成你选中的地块
-Spawn PBG for All PSBuildings:生成所有的地块。前提是你有一个好机器。
-Click for Batch Spawning:指定数量的批量生成,数量可以在Max Spawn per Click上来设置。
我自己的机器I9-10900K,64G RAM,RTX3080的机器,我只敢使用批量生成10个,我尝试了一下生成全部,在这么一个小地块,居然D3D模块崩溃
生成的效果还不错吧!
Step XI:烘焙屋顶以及地面的Actor
还是找到PCC_Main_Widget,执行脚本,翻到最后一页。
我们关注两个按钮Click To Bake PCC Ground Plane和Click To Bake PBG Roof Plane。
不用我说了吧,点就是了。
Step XII:DataLayer与性能优化
我们现在已经有了一个街区了,现在我们需要做的,就是把已经生成好的内容正和岛一个Data Layer里面去,这样我们才有更多的性能余力来生成全部的城市。
选择一个已经生成好内容的单元格,找到Don’t Touch分栏,复制一下Cell Name Tag属性的值
在你想要储存DataLayer的目录下,创建一个DataLayer资源,并命名我们之前拷贝的那个Cell Name Tag
打开DataLayer Outliner窗口,创建一个新的Data Layer
创建好新的Data Layer之后,我们把我们之前创建的Data Layer资源配进去
然后再执行PCC_Main_Widget脚本,翻到中间那一页,点击Click To Organize Into DataLayers按钮
一切都搞定了之后,保存一下关卡。然后我们卸载掉刚才的DataLayer,看看那个单元格上的内容有没有跟着一起卸载掉。
这里需要注意一点的是,如果我们想要保存单元格(Cell)里面的内容到DataLayer的话,我们是借用Cell Name Tag的命名来让脚本自动执行的。如果我们想要保存的是整个街区(Zone)的内容的话,需要找的是街区的Random Zone Name属性的值。没办法,蓝图脚本权限不高,所以做的东西是有点简陋。
Step III ~ Step XII:完善整个城市
可以重复之前的几个步骤,把整个街区都生成出来了
Extra Step:手动制定关卡
正如我之前说的,不可能所有的内容都靠程序化生成手段来生成,总有一些地方是我们迫切想要手动设计的地方。
这个时候,我们就可以考虑删除某个地块(之前我们有做过规划的)的地上建筑,然后使用PSB搭建白盒关卡,然后再找一些参考图给美术来继续完善。
我选定好了这个地块,然后把地上建筑删除掉
不过这一过程,最好不要等地上内容都生成好了之后再去做,而是要在地块生成内容之前就要确定好哪些地块不要生成内容。要不然删起来有点费事。
随手搭建了一个简易的白盒关卡,标注策划需要关心的空间,毕竟GTA这类游戏还是以室外为主,所以大楼内部的结构不需要过多操心,我们只需要关注一个车库大小的空间即可。
然后再准备一张参考图给美术,告知策划是希望这里设计成一个工人宿舍,这里将会发生一个【抓捕因欠下巨额赌债而隐姓埋名的前黑帮成员】的任务。
Step XIII:生成高速公路、河流等
我们先选中City Zone Actor,在属性面板中找到PCC Command分栏下的“1-Spawn Highway Roads and Connections”按钮,点击
你会发现高速公路的衔接处有点不太对劲,先不要着急。
再找到之前创建的河流的Actor(PCC_Road_Spline),在属性面板中找到“Update All Props Manager from Data Asset”点击一次,然后再把Activate Props设置成True,最后点击“Bake Road Props”按钮
别忘记,之前手动摆放的高速公路也要按照这个步骤Bake Road Props。
下面,我们开始合并所有的道路。
选择所有的City Zone产生的PCC_Road_Merger Actor,在属性面板中把“Use Manual Selection”设置为True,然后再点击“Bake Mesh To Content Browser”按钮来烘焙Mesh。
然后再按照这个方法合并其他道路。
效果图
郊区以及野外设计
这部分就没有好的工具来生成了。考虑到量不大,手工制作成本并不高。
策划流程上,就是和我之前介绍的一样,摆白盒,然后找参考图,交给美术来制作。
唯一值得注意的就是路线设计,再农的村,也要有一些道路的规划,不一定是沥青公路,也要有一些山路等。
地形的包边
由于地形的生产,还是基于heightmap来完成的,所以仍然存在heightmap的缺陷,既大于90度的地形是无法实现的,甚至接近90度的地形效果都十分不佳。
所以还需要美术利用一些山石、路牙等Mesh,对地形进行包边。
总结
本文提供了一个制作GTA类游戏地图的思路和工作流以及工具教学。
为了篇幅考虑,本文并没有很细致的讲解所有环节。
其中待开发内容有:
Gaea的详细教学如何利用Gaea染色地形,然后导入Unreal,再生成贴图如何在Unreal中使用程序化生成手段,生成植被
另外,关于Procedural City Creator的吐槽
总的来说,PCC这套工程,还是很出色的,但是在使用过程中存在大量的问题:
BUG实在太多了:①存在各种应裁剪而未裁剪的地块;②存在各种该生成而未生成的地块;③莫名其妙的多边形算法。说明书不健全:很多内容需要使用者自己来探索,说明书只是大概介绍了一个使用流程,存在不少暗坑。由于是蓝图脚本的原因,步骤繁琐,易用程度很差只支持在平地上操作经常崩溃
综合来看,当前版本不推荐商业使用。
这些问题我都有跟作者沟通交流,对面承诺会在未来的版本逐一修复。
一个全新强大的程序化生成城市的工具预告
https://www.zhihu.com/video/1670094470052536320
等我之后出一个这个工具的教学。
来源:知乎 www.zhihu.com
作者:Einsphoton
【知乎日报】千万用户的选择,做朋友圈里的新鲜事分享大牛。
点击下载
© 2023, 免責聲明:* 文章不代表本網立場,如有侵權,請盡快聯繫我們 info@uscommercenews.com * 讀者評論僅代表其個人意見,不代表本網立場。評論不可涉及非法、粗俗、猥褻、歧視,或令人反感的內容,本網有權刪除相關內容。.