写在前面
本项目同步上传于coding上,国内读者可以通过在coding下载项目。
也欢迎你加入我的UE4学习交流QQ群:872537977。如果你喜欢我写的文章,也希望你点赞、收藏、转发。谢谢!
如果你喜欢我写的文章,也希望你点赞、收藏、转发。谢谢!
如果你想参与到这个项目的开发中来,唯一的要求是像我一样编写开发日志让更多的人看到并学习。
coding地址:https://git.dev.tencent.com/JeremyBrett/uRPG.git
上周五这周一请了两天假,去内蒙古额尔古纳散散心。回来之后就感觉很疲惫,前几天下班回到家都是秒睡。今天算是缓过来一点了吧。这些天把开发任务暂时搁置了,在路上我也看了不少关于随机地形的技术文章吧。还是有点儿困惑的,这次决定一反常态。不再记录开发过程,而是把思考的过程也记录下来跟大家分享,也希望小伙伴们能有些好的意见或者建议吧。大家分享一下。
Rougelike思考
在之前的策划案那一期,我说我想做一款Rougelike向游戏,或者说沙盒游戏吧。这主要是考虑到我自己的短板,既没有强大的剧情脚本撑腰,也没有很好的美术效果或者程序产能。在这种情况下,能够重复游玩的Rougelike游戏似乎是我绝佳的选择。换句话说,我唯一能搏一搏的就只有“游戏性”了。
之前有写过一篇关于Rougelike游戏中的资源投放设计的文章,看的人还挺多的。也有人质疑这部分内容应该是“关卡”内容而非“数值”内容。实际上所有和游戏体验(游戏节奏)相关的内容都是有数值参与的。曾经有同事说出“我认为调体验能不用数值就不用数值”的高论。我当时就很好奇“游戏体验,不调数值?那调什么呢?”。有些人对数值的工作范畴有误解,以为游戏中只有属性、战斗和道具价格,物品掉率这些和数值有关系。但世界上并非如此。
即使在一个线性叙事的单机游戏中,也要将一些核心参数抽象出来,用来不断调试,达到最满意的体验。比如说这个线性叙事游戏总流程1小时,其中分为2个大章节(每章30分钟),每个章节中有5个小段落(每段6分钟),然后每个段落中会有1场战斗(2分钟),还有3个谜题(每个1分钟)。这样不断拆解下来,就对要做的游戏有了更为客观、理性的认知。也就解决了不知道如何开始制作的问题。
有点儿扯远了,还是说会Rougelike的问题上来,在这个游戏中,我首先想到的就是可重复游玩的价值。《文明》为什么会不停的开新存档?为了刷出一个更新奇的开局地点。每一次开局都会至少在前期创造一种完全不同的游戏体验。《饥荒》、《minecraft》等沙盘生存游戏也是如此。
但是我又想到了另一种不同的可能性,那就是《骑马与砍杀》。骑砍的地图并不是随机的,骑砍随机的是另一个维度——事件。骑砍的世界有一套自己运行的机制,所以虽然世界是固定的,但事件是随机的。因此每一个新的存档的体验也会有很大不同,这种差异是很强烈的。换句话说,即使玩家有意为之,也很难复刻完全相同的剧情。
但是关于随机事件,这是另一个话题了。我们今天首先考虑的还是随机地形的问题。
什么程度的随机地形
事实上我一直再考虑这个问题,是否要使用随机地形?是哪种程度的随机?是体素世界吗?是无限还是有限的?
我很快回答了第一个问题:我要使用随机地形!原因很简单,有随机地形元素的游戏让我着迷。我能随便说出我游玩时间最长的游戏:《饥荒》《文明》《缺氧》《环世界》《放逐之城》等等都是随机地形的!我着迷的游戏元素,我也能最大程度的去还原这部分游戏体验。
接下来第二个问题:是哪种成都的随机呢?
要不要做一个体素的世界呢?从《minecraft》开始,到最近玩的《方舟:方块世界》、《创世小玩家2》这几款游戏,我必须要说,体素世界有太大的游戏,那就是堆积木似的游戏体验。体素是游戏世界的基本组成单位,这带来的是超棒的扩展性。举个简单的例子,未来我想做一个“建造系统”,这个建造系统可能类似《堡垒之夜》、或者其他有建造元素的生存游戏,但是这样的工作量会翻倍。我也并不知道能否驾驭这种工作量。但是类似的系统在体素世界里要简单很多!所以这个念头很诱人,让我几乎没有不使用体素的理由!
现在好了,来回答第三个问题吧:是无限的大地图吗?
《minecraft》有着无限的地形,但它的问题就是局部重复性很高。事实上我认为地形的“大”是个很难传达给玩家的概念,或者说只能作为一个噱头。玩家在意的是游戏是否好玩,但地形的庞大并不能和游戏行建立直接的关系,参见《无人深空》。基于这个思考,最终我打算使用大小固定的随即地形,就像《饥荒》或类似的游戏那样。
现在,基本的方向我们明确了,那么我们来考虑一下关于技术实现的一些设计思虑吧。
使用C++
很不幸的消息就是我在地形生成这部分将使用C++完成,虽然我认为用“蓝图”也可以实现这部分功能。但是众所周知,使用蓝图来实现算法部分是很痛苦的事情,原因就是运算过程变成一个个节点后反而麻烦,影响开发效率,并且在执行效率上也没有优势,我们在开始使用蓝图的时候说,它是为了提高开发效率而牺牲部分执行效率,既然在这个环节上开发效率也没有提升,那就果断选择C++了。
设计过程
我想具体的设计和实现过程可以单独写一篇文章了,我这里只是大概介绍一下我实现的顺序。首先是实现一个无限生成的大地图。这个大地图由若干个Chunk组成。玩家的坐标更新时,这些Chunk会跟着加载或卸载(所谓加载或卸载就是将对应的Actor产生或移除,并将数据缓存起来,以此来达到提升性能的目的)
然后就是使用噪声来生成不规则的地形了。这部分看起来不容易,但实际上还算简单。
真正复杂的是关于生物群落的创建,这部分我暂时思路还不是很清晰。一边做一边思考实现方式吧。有了解相关实现方式的小伙伴也欢迎分享一下。
网友评论