《兽人幸存者》:程序猿单刷Boom之旅


3楼猫 发布时间:2024-09-02 14:32:25 作者:冻爪爪 Language

大家好,这里是冻爪,第二次参加BOOM。这次是单人参赛,想挑战下自己的极限!
《兽人》是一个看上去很大的游戏:场景很大,敌人很多,装备很多。
这是我制造的假象,《兽人》的内容量和我的实际工作量是有出入的。我写了一个能支持一系列基本的指令的数据结构。然后只要将这些基本指令,排列组合,就可以生成大量的内容。就像搭积木一样。
《兽人幸存者》机核链接 最新版网盘地址

"I have a plan"

Change your ___, not your ___.
这次Boom的题目看不懂。这个黑色字体填空题,我唯一能想到的就是耐克,因为耐克广告也是黑色字体。
既然没思路,那就从自己的优缺点开始分析。确定了游戏的类型,再决定题目。策划、剧本、美术、程序四个方面,单走的我该如何取舍呢?
  • 首先我没做过策划。我一个月前尝试写过策划案,只憋出来两页。作为比较,上一次Boom我们组的策划写了几十页,还有Excel和ppt。我的策划能力显然是地下室级别的。所以,我这次的游戏必须足够直白,不能有关卡,绝对不能有解密。
  • 我会写作,但不多。写剧本要占用很多游戏开发的时间,与其写一个半吊子剧本,不如多花时间写几行代码。所以不要剧情了,砍掉砍掉。
  • 我会画画,但速度很慢。速度慢,那最后肯定得加入素材图,一旦素材和自己的美术风格不统一,就会吃力不讨好。干脆全用像素素材包。不同像素素材包之间差别小,改起来也简单。
  • 我会编程...而且还挺强。所以我要强化自己的优势,挑战更难的代码:
开放世界,程序生成地形,做!
随机装备技能,肉鸽刷刷刷,做!
大场面战斗,屏幕里一百个敌人追杀主角,做!
我来用随机函数狠狠堆料!我要煮一锅乱炖,献祭给混..(划掉)随机女神!
大就是好,多就是美。
确定游戏方向后,我拍了拍脑袋有了主题。
兽人小贼,在无边无际人类地盘上不停的奔跑!一边偷盔甲,一边被追杀。不断升级词条,直到盔甲升级到能无视所有人的攻击!免伤100%。
我命名为《盾之勇(划掉)...《兽人幸存者》。
Change your armor, not your sword.

具体灵感来源移步我的鸡脖

查看详情


完美的计划,what can go wrong?

以为有素材包就万事大吉?

美术方面我决定使用2.5D像素风格。世界基地是3D的,是由类似MC的方块组成的,我只需要画几个方块,然后通过程序生成地形。世界里的小人儿和景物都是2D像素素材。
游戏最终效果:地块是3D的,人和景物是2D的

游戏最终效果:地块是3D的,人和景物是2D的

我在早先时候购入过两个像素素材整合包,一个是环境素材,另一个是像素小人各种动作的三视图。我天真的以为这就够了。但是...
一个2D角色,想在3D环境中自由转身,前左右三面是不够的......必须补全背面,前左,前右,后左,后右,八张图!
素材包里的 VS 我补全的

素材包里的 VS 我补全的

跑、跳、待机、攻击,每个动作8个方向,考虑左右、上下是镜像,我需要画5个方向。同时每个动作4帧动画,加起来就是4x5x4=80张图。扣掉素材包里有的,我还得补全大约50张图。
所有角色

所有角色

画主角小兽人画了5个小时,绷不住了,握鼠标的手都麻了。我决定所有敌人都不能跳跃,这样可以少画一个跳跃动作,每个角色起码省掉15张图。
在画了6个角色后还是受不了。于是我把魔法师敌人设定为固定炮台,省掉跑的动作。最后狗狗更是偷懒了,没画正面和背面。
画完敌人后,用以前项目写的状态机给敌人们加了AI,近战、远程、狗,一共三种行为模式。
弓手状态机

弓手状态机

此时,Boom过去了将近一半。

开放世界不是这么简单的

抠像素图严重扰乱了我的计划,于是我向公司请了一周假搞开发。
在网上学习了下如何用Unity柏松函数生成等高图,进而生成地形。我可以通过调节参数改变地形的崎岖程度,每套参数搭配一个独特的地块,就成了一种新环境。所以实际上的美术只需要一个方块的贴图,辅以像素图包里现成的2D景物图,就能实现好看的场景。我成功把美术问题转化成了程序问题。
多种地貌

多种地貌

地块生成会卡顿一下,然后地图突然加载出来。我不喜欢这样,我希望玩家能看到地图生成的过程,于是我把过程拆分成了十几帧,玩家就能看到地图从光秃秃的地面,慢慢填满景物和敌人的过程。游戏的开始界面就是世界生成过程。
要做开放世界的话,还要考虑性能表现。我开发使用的是2021年的macbook pro,已经很过时了,所以如果游戏能在我的电脑上流畅运行的话,大部分玩家都不会遇到问题。
如下图,我准备要根据主角的位置时时更新周围的场景。即根据和玩家的距离,决定是否显示。为了减少卡顿,这些刷新会拆分成4帧完成:第一帧刷新敌人和投掷物,第二帧刷新宝箱和警戒值,第三帧刷新景物,第四帧刷新地块。实际测试效果很不错。
然后我遇到了问题——敌人的寻路AI没办法跟着生成的地图动态变化。敌人没法识别新生成的地形,只会蠢蠢地目送玩家逃跑。
寻路AI需要预先扫描所有地形来计算AI的路径,但我的地图是实时生成的,这就导致我必须在游戏中,每隔几帧刷新下寻路的范围,不然AI就会撞上空气墙。这会给程序带来很大负荷,玩家可能遭遇卡顿。
权衡之后,我决定抛弃开放世界,采用关卡式设计,每一关使用一个200*200的随机生成地图,玩家在到达地图边缘后往下跳,就会进入下一个关卡。

难度曲线

采取关卡的设计,除了保障运行顺畅,还有一个额外的好处——我可以更轻松地控制难度曲线。如果玩家在上一关玩的太轻松,我就可以在下一关增加难度。
游戏里使用了如下难度调节:
  • 玩的时间越久,敌人伤害/攻速越高,攻击冷却越短
  • 玩的关卡越多,地图上的宝箱越多,宝箱里的装备越好
  • 上一关开的宝箱越多(游戏中用通缉度表示),意味着上一关难度过低,下一关就会提高远程敌人的数量
我有点沉迷做编辑器,花了不少时间做了难度调节界面,却只用了一次。纯纯浪费时间了属于是。其它Solo的同学引以为戒,给自己用的玩意,不需要弄UI。
敌人伤害修正,宝箱密度,通缉度,敌人种类密度

敌人伤害修正,宝箱密度,通缉度,敌人种类密度

既然提到了难度控制单元,我给大家看看其他控制单元吧。我这次所有控件全都用可编程对象(ScriptableObject)写成,也就是说所有的游戏逻辑是和场景解耦合的,控件间的交流是发生在场景之外的。
这比单例模式(Singleton)好的地方是,即便场景内缺少某个控件也不会报错,我可以单独测试一个或几个控件。单例是场景内唯一,可编程对象是整个游戏内唯一,每次改动控件参数,它们就会在所有场景生效。
相机控件,宝箱控件,难度控件,敌人控件,输入控件,背包控件,子弹时间控件,世界生成控件

相机控件,宝箱控件,难度控件,敌人控件,输入控件,背包控件,子弹时间控件,世界生成控件

技能和装备词条

在最后三天的时候,我终于开始做技能了,一个刷装备的游戏直到最后才开始做核心机制(捂脸)。
我放弃了许多设想的很酷很帅的技能,现在只要能把游戏做完我就谢天谢地了。
我的思路是把主角的所有属性划归为数值,然后所有装备的词条就是在围绕这些数值做文章。我避免一些独特的机制,比如与敌人有交互的机制,撞开敌人,吹飞敌人之类的。
我设计的技能就只是围绕主角本身的。比如加速技能,就是主角速度*2,在3秒后速度变为正常。无敌技能,就是把受到伤害锁定为0。多段跳,就是允许玩家在空中多按几次跳跃键。它们的实现只需要一两行代码。
我唯二专门做的技能是闪现和子弹时间。因为《兽人》是一个跑酷躲避敌人的游戏,玩家的移动性能必须足够高,闪现和子弹时间是快节奏游戏里必备的技能。
游戏中一共有4种闪现词条:往前闪现/短距离随机闪现/长距离随机闪现/闪现到下一关。他们搭配不同触发条件:受击触发/破甲触发/主动触发,有12种变种。子弹时间则是根据时长分了4个档次,同样搭配3个触发条件,12种词条。
为了填充数据方便,我给每种属性变化设了代码。最后好巧不巧,一共99种词条。这些词条按照强度,分成低、中、高3个池子。不同等级的装备会有概率从不同的池子里抽选词条。池子里有些技能的出现概率会高于别的技能,保证玩家不会突然爆发。
截止前12小时我还在填表。经过测试,最后的最后,在截止前6小时,游戏完成!!

感想

这次Boom我时间管理出了些问题,幸好我是一个人做,迅速调整了计划。这个题材我是拍脑瓜子决定的,没什么深度,真要给我再多时间,恐怕提升也有限。之前按照反馈更新了一次,提升了一些用户体验。但我之后也不会继续开发下去了。
这次Boom我可以算是莽过关了。能做完我很开心。自己缺乏的东西真的很多,下次希望和别人合作完成吧,一个人的力量确实是有限的。兄弟们下次约!
(觉得好玩的给我投个票






© 2022 3楼猫 下载APP 站点地图 广告合作:asmrly666@gmail.com