佛曰:那南赡部洲者,纵情声(Hifi)色(8K),多杀(狼人杀)多争(排位赛)。我今有低预算小游一款,画风丑陋,望之眼胀头痛;难度逆天,玩之脑门皆裂。今借贵地寻善信,能破此难关者,定是那西游取经人。
起源
最近参加聚光灯GameJam,做了个大唐之光——唐光头使用金箍棒攀爬五指山的游戏……不错,正是类掘地求升的高难度自虐爬山游戏!
Taptap链接:点击跳转
Steam链接:
为什么要开发这么难的游戏呀!做个轻松愉快的无脑小游戏不好吗?
最近朋友工作中参与了一个新项目,客户人均谜语人,拒绝提供详细的实施方案,只会施舍只言片语让你破解其中的含义,每次团队好不容易打包出一版却得到回复:哎呀!这可不是我想要的效果!你们行不行呀~重做!
这种被重复打回原点的屈辱,这种在泥潭挣扎又无法抗争的无力感,困扰着千万社畜,也给了我难得的创作灵感:要是把它们具象化做到游戏中,怎么才能让玩家进入社畜心流,切身体会到客户的变态呢?这里就要提及当代折磨游戏鼻祖《 Getting Over It with Bennett Foddy(掘地求升)》及《Jump King》,当玩家奋斗许久,屡次因为一点小失误就掉回老家,最终崩溃大叫的失控瞬间,那正是我想传递的辛辣感受。
取材于工作,做成年人爱玩的职场游戏。
角色设计
唐僧篇
《西游记》这么多角色,为什么偏偏选唐僧当主角?
既然BennettFoddy使用长锤登山,那么本游戏的角色也应该有类似的长条攀爬道具。四大名著中首推金箍棒,然而用孙悟空作为主角有个大问题,那就是前期悟空战力被捧得太高,在他的眼里根本就没有难事只有不愿做的事,任何难题都可以一棍荡平。游戏/影视中为了给故事增加波折,通常会对悟空进行各种弱化:出场角色只是悟空的猴毛分身或转世,在恢复真身之前一直被Boss吊锤。悟空本猴即使出现,也不能是主角,毕竟角色太强,玩家非但无法获得成就感,还特别容易厌倦。
那就换一个罢。《西游记》中神魔斗法各显神通,导致大家忽略了凡人唐僧才是真正的主角。 孙悟空等徒弟只是他朝圣途中招募的服刑打手,八十一难主要是对唐僧的考验:
八十一难(又叫唐僧从小遭罪记)
这里截取一下书中唐僧的表现,了解一下他的真正性格。他曾在出发取经时向皇帝豪发毒誓(图1),并在同行面前表现出一副透彻的世外高人姿态:“ 心生,种种魔生;心灭,种种魔灭。 ”(图2)
然后我们看一下他初遇难关的表现:
总结起来就是:胆颤心惊,涕泪横流。不愧是大唐真香僧,嘴上说什么四大皆空,遇到要命时刻,立刻把佛祖舍身饲虎的箴言忘得一干二净,挽住救星不肯撒手。总而言之,唐光头起初的自信来源于其丰富的理论知识和涉世未深的天真,总以为念经能化解一切矛盾。正如饱读诗书的大学生,只知数理化能走天下,却不知社会并不光吃这一套。当他离开了大唐的庇佑,独自面对致命危险时,将自出娘胎后的泪都哭干了。
唐僧这个手无缚鸡之力的凡人,在妖魔横行的世界,要想独自取经可谓难于登天。正是这巨大的能不配位感,让我想到了一个场景:唐僧为了释放孙悟空,需要拿上难以驾驭的金箍棒,靠自己的毅力逐步攀上逆天的五指山高峰,途中不断被各种机关打回原点,正如社畜掉入汹涌的客户需求浪潮中一样无助翻腾,实在是太他完傌美了。
面对这奇葩的任务,唐僧不需要理解,不能够质疑,只要听话执行就好了。
悟空篇
唐僧和孙悟空两个受刑人在五指山下相遇,他们对彼此的真正看法是怎样的?孙猴子被困了500年,好不容易遇到救星必定是先大大奉承一番,并在脱离苦海时按约定报答一番。可惜能力超群但耐性有限的悟空从不服这凡僧,后期破防时甚至一度想下死手;唐僧也嫌弃悟空不会“做人”,且业务能力跟简历差别太大。有文为证:
唐和孙的关系正如职场中出色下属与无能上司一样:下属总认为上司没资格在本爷头上指手画脚,上司唯一存在的意义只是填补座位罢了:上司则觉得手下都是猪。所以在游戏中,孙悟空一开始还会对玩家客套一番,但是看到玩家屡次掉回原点后,就会逐渐阴阳怪气起来,言语中多了三分挖苦,还有七分质疑:
设想一下,假如悟空真是个跳出三界外的高维生物,他打破次元墙俯览全局时,也会预知玩家并不是唯一能解救他的人,世界上还有无数个“唐僧”在尝试完成本关。悟空对玩家并不寄厚望,可以减弱玩家那股“我是主角”的使命感,进一步挑战玩家的忍耐度。
被蹲局子的猴子鄙视,那是真难受。
原型开发
角色能力
本游戏中,唐僧是个双脚健全但不能一蹦3.5米高的普通人,他只能像《掘地求生》的缸男一样靠着金箍棒勇攀高峰。因为金箍棒有可大可小的特性,所以玩家除了能控制棍子朝向外,还能控制其伸缩,方便根据地形空间动态调整棍子尺寸,以及产生弹跳力。
利用伸长的力度进行弹跳
金箍棒还支持在顶端吸附物体(如星星),方便扒拉顶端的悬崖峭壁,后期将会支持更多奇形怪状的装饰物。
吸附星星
光是爬山有点无聊,笔者打算根据《西游记》的设定给唐僧设计技能。重看《西游记》,你会发现唐僧身旁竟然有30多位神明保镖暗中护佑,当唐僧一行人彷徨哭闹时还会有救星凭空冒出。如此豪华的助理团,像不像公司CEO让老员工给不成器的少爷布置历练难题,可以往死里整,但不能整死。
结合原作中唐僧是个爱哭鬼这一特点,笔者让唐僧拥有“哭”这一技能。虽然这一技能乍看之下除了增加直播效果并无卵用,但是只要获取隐藏道具“菩萨召唤器”并大声哭就能感动菩萨,菩萨会将山下的缓冲水池带到当前镜头下方以减缓掉落趋势。这也算是一种辅助道具,能够避免玩家因为部分关卡难度过高而弃游。
唐僧大哭召唤缓冲池
隐藏道具“菩萨召唤器”的获得方法:
在2秒内哭着连续敲击三下猴头。
金箍棒
金箍棒的物理运动是个难题,因为棍身有碰撞区域且长度可变,被唐僧握持的同时也要为其施加反推力,参与多种外部碰撞体的物理运算,需要确保它在本游戏不同大小的空间内都能自由伸缩及收回。这时掘地求生那种硬连接方式就无法直接用于本项目,因为容易卡在缝隙中。
掘地求生因为硬连接而卡在最后的信号塔上
经过多次试验后,我发现让唐僧与棍子之间提供缓冲可以减少卡死现象,所以使用了内置的RelativeJoint2D组件,它的作用是根据设定的力度,让两个刚体以特定角度保持一定距离。虽然该实现会导致金箍棒在卡缝时会临时脱手(此时多转几圈还会像弹簧一样蓄力),但大部分时间都能够收回。
平台搭建
进行关卡原型设计时,为了加快开发进度,需要先绘制平台草图。笔者使用了开源的drawio软件,该软件提供矢量图编辑功能,自带丰富的图形库,可用于快速搭建简模关卡。笔者还能在特殊机关旁添加备注信息,使用虚线分隔子场景,并用颜色区分不同风格的元件。
草图绘制完成后,将整个项目导出svg(矢量图格式,Unity端需要下载Vector Graphics插件才能支持)文件到Unity中,该格式可以规避Unity对图像最大尺寸的限制。将该矢量图放到背景作为参考,然后使用通用素材进行构建和调优。
参考矢量图搭建场景
为了避免玩家对单纯的平台跳跃感到枯燥,游戏中会随着高度增加不断引入新机制(如低摩擦力的冰面、弹簧墙、形变的气球平台),跟解密游戏一样,玩家需要学习并研究出新应对策略,通过撑、挑、扫、扒等棍法攀出新高。
需要注意的是,为了提供速通玩法,本游戏并没有限定唯一路线。平时看速通视频(如《半条命》、《塞尔达》和《光环》等)时,既会佩服玩家的操作技巧,也会惊讶即使逃关游戏还能正常运行。可速通的游戏通常都会有一定的自由度,有很多任务都是可选项,玩家只需要在关键位置“打卡”就能正常推进剧情,当新手老老实实地听NPC介绍游戏背景时,老司机早就急不可耐地御板飞到终章。本游戏也是基于这个原则, 保留了部分无伤大雅的“捷径”,期待能看到高手意料之外的邪道速通。
特性·机械同步
在设计关卡草图时,我看到了一个齿轮零件,当时就在想:能否增加类似单车链条的实时物理传动结构。虽然这类结构在很多解密游戏中经常见到(如吊篮),然而搜了很久都没找到合适的开源库,只能临时手搓。目前实现了以下几种传动功能:
多个同类的齿轮/滑块零件之间同步传动,支持齿轮比缩放和反转。原理是使用管理器管理一组相连的零件,实时搜索当前受到最大外力的零件并将其受力同步给组内其他零件。缺点是当组内多个零件同时受到外力时会出现不同步的bug(要是玩家问起来就说是模拟现实打齿现象🤣)。
齿轮转动会单向带动滑块在线性区间内平移。原理比较简单,就是将齿轮的转动进度传给滑块,滑块会基于传入的归一化数值移动到正确位置。
齿轮/滑轮传动
特性·电流传导
当关卡高度来到200+米后,本想着可以加上一些云层装饰来表现山的高耸。转念一想,游戏中出现的元素不应该只是摆设,既然有云,那不如给玩家来点刺激的玩法。于是在背景添加了足量的雷云,当玩家在雷云即将放电时正好用金箍棒指向它,就会被电击而进入僵直麻痹状态(类似避雷针的原理)。
“避雷针”效应
雷云设计完成后,笔者又想:既然出现了电元素,而金箍棒又能导电,那为什么不把一些平台也变为可导电呢?于是我重构出通用的电流系统,又新增了一个可自充电的电池作为导体平台的供电源,它会对相连的导体平台进行放电,玩家需要在断电的间隙及时跳到安全区域。
因为涉及动态导电体(如上图中金箍棒推开竖着的导电体后,右侧中间的平台就因为缺少电源而断电),所以实现比较复杂:导电体保存着相连的电源(电池或正在闪电的雷云)清单并在电源通断时同步其开关状态,在接触/脱离其他导电体时也会进行更新该列表。
Tips:玩家经过这段雷区时,注意不要耍小聪明走捷径,不然容易被持续通电的导电体挟持,变成烤肉:
特性·水体系统
前面提到,水池可以为唐僧提供缓冲,该设计主要借鉴《A Difficult Game About Climbing》及其开发解说视频,该开发者为了避免玩家一路掉到原点,所以在每一关都布置了一个水池作为休息站(可能就因为这一良心发现行为导致其游戏无法大火🤡)。
《A Difficult Game About Climbing》的游泳方式
实现如下:水体的物理浮力效果使用Unity内置的BuoyancyEffector2D组件进行模拟,水面的波浪效果则基于2D Interactive Water库。唐僧在水中还能通过上下摆动金箍棒的方式进行游泳。
本游戏虽然提供了星星、水池这类爱心关怀特性,但笔者认为玩家有权决定是否使用及在何处使用,所以改为需要主动哭才会抬升水池。高阶玩家能够全程不使用任何辅助道具通关,休闲玩家则可以一路哭着爬上去(会统计哭的次数噢!)。
有水池就可以一路逃课了吗?那也太没意思了,后续会考虑削弱其功能,比如让水体导电(结合上一特性),或者让其持续漏水,通过多元素之间的反应为玩家带来更多惊喜。
PS:水池中的鱼群来自上一届机核GameJam的参赛项目《挣点薯条 E.S.C》素材。
对话系统
以前玩剧情解密游戏的时候,一直好奇对话的逻辑是怎么实现的,感觉光是处理剧情分支都是个大工程。也曾在Unity商店也找了很多基于Node节点的对话系统,但总差了点意思,因为可视化编程容易使工程变成一团乱麻,且大部分插件无法应付复杂的逻辑判断及多语言。后来终于找到了一款基于标记语言的插件库 YarnSpinner-Unity,该库不光含有完善的逻辑判断、函数调用、多语言及配音支持,甚至还提供了完善的Demo,无需编程上手即用。熟悉这个插件的基本用法后,我就跟婴儿刚拿到新玩具一样,忍不住往游戏里面加各种支线、彩蛋及骚话。
多语言部分使用了Unity官方的Localization插件,再配合自己魔改的LeanLocalization自动翻译模块,可以一键将中文转为多国语言(包括外星语!)。至于翻译质量嘛~那就看他国玩家的领悟及造化了。
任务及物品系统
起初这只是一个简单的爬山小游戏,但是既然有了完善的对话系统就自然会想着塞点剧情,有剧情就意味着游戏需要获取玩家当前状态(如主任务及所持道具)才能提供下一步反馈。因此,游戏还缺少一套任务及物品系统,并且要支持序列化(存读档)。经过一番检索,依然是没有合适的插件,只能手搓!
实现如下:通过ScriptableObject存储每唯一的任务/物品,并且提供对应的监听器(Listener)组件监听其状态变化。当玩家获得/完成指定任务,或者得到/消耗指定物品时,就会显隐指定物体或执行相关回调。以开篇玩家获得“拾取金箍棒(0_PickupCudgel)”任务为例,此时插在地上的金箍棒会因为玩家获得该任务而立即显示,并在任务完成时消失;当玩家拾取了该道具后,其道具库就会增加一个“金箍棒(Cudgel)”物体,同时唐僧手上的金箍棒会因为玩家获得该道具而立即显示。
虽然游戏越做越复杂,但同时也是收获满满,因为直到自己思考动手之后,才终于亲自解答了打小就有的疑问:太神奇了!这到底是怎么实现的?
物体材质系统
到了这一步,游戏基本已经是勉强可玩的形态,但还欠缺了一些很重要的内容:反馈。正如动作游戏为了提供打击感会使用抖镜头、慢动作等技巧,本游戏也需要为了优化效果提供反馈,本节单独讨论声音和粒子特效。唐僧在草地上走路的声音应该和在木板上不一致,金箍棒也只会在敲击硬质物体时产生火花,因此游戏需要标记物体的材质,并提供匹配的反馈信息。
实现:参考Unity中物理材质(PhysicsMaterial)的原理,本游戏使用ScriptableObject存储泥土、草地等常见类型的物体材质并赋予场景实例,在运行时检测玩家所触碰物体的物体材质并播放对应的声音或粒子特效。这套系统的优点是简单易拓展,后期还能实现类似《塞尔达传说旷野之息》的元素反应。
关卡难度
事实是,如果不用考虑用户感受,那么设置一个逆天的关卡可就太简单了。我的方法是:
- 先制作正常的关卡,然后进行单元测试,在确保能通过的情况,缩小或删掉玩家重点依赖的支撑点,扩大平台间的距离,增加破防机关的数量。怎样才算达到要求呢?大概就在我也受不了的时候吧。
- 预防玩家使用常见的大力出奇迹爬法(如撑墙跳或无脑大风车),降低两侧墙壁的摩擦力。
如果只是一味增加难度,可能会赶走部分休闲玩家,我的目标是让每类玩家都尽可能完整地体验游戏,所以也会对游戏增加戏剧性的转折点。玩家游玩时的心情,应该是一种波动的曲线图(下方包含大量剧透,不建议通关前观看,否则会失去大量乐趣):
- 玩家在拿到金箍棒并看完操作教学后,会有一个正常的心理预期:哎,这不就是翻版的掘地求升嘛~没啥特别的!
- 当玩家跳上如图1的初始平台,就会发现的两棵迎客松异常难爬,这时候应该就有人会因为无法利用已知技巧过关而烦躁:《掘地求升》哪有这种地形?这怎么能爬得上去?作者不是在耍我吧【此时心情落到谷底并产生质疑情绪】?
- 如果玩家掌握技巧来到如图2的高度,按照悟空的指引把星星摘下并装到棍子上后,就会发现先前难爬的地方根本不值一提,此时又会产生“我又行了”的骄傲情绪【此时心情大好】。然而玩家不知道的是,星星熄灭的光芒暗示了后面关卡的黑暗🤣
- 当玩家历尽千辛万苦终于爬到山顶,等待他的不是一句:“恭喜通关,你好棒棒哦~”,而是:“资料没带齐,赶紧从管道滚下去问悟空要!”【心情先是到达顶峰,然后跌至冰点】。玩家本以为背景管道会在爬山中途送玩家回家,没想到竟然是需要亲自跳进去。听此噩耗,即使是唐僧本人来了,也得心态爆炸。
- 如果玩家克服了这次巨大的心灵打击,并且成功二次登顶,游戏会弹出几个选项:是顿悟开启成佛路,还是怒揍“看守人”一顿出气?不管如何,最终心情都会归于平静,就像泪水消失在雨中。
玩家心情波动图
历史中的唐僧为了取经晓行夜宿,饱受蚊虫叮咬、日晒雨淋,讨着残羹冷饭,是真正的苦行僧;而玩家仅仅是坐在舒适的房间中敲着键鼠,嘴里还嚷着:这也太痛苦了吧!
怎么在第一分钟吸引玩家?
基于家喻户晓的《西游记》故事,如何给玩家呈现出一个不同寻常的戏剧性开局,这是困扰我整个开发周期的问题。既然唐僧使用金箍棒是个亮点,那就给玩家一个难忘的赠与动画吧!当玩家看到悟空从耳朵掏出逐渐伸长的金箍棒,并且甩出巨量耳屎时,都会惊叹:怎么那么多、那么大!这一看似荒诞的场景,立马勾起了玩家的兴趣,同时还传递了几个信息:
- 金箍棒可伸缩
- 游戏含有物理效果
- 开发者很爱整活
赠与动画
回答本节的标题疑问:是耳屎,我加了耳屎。
后续计划
游戏本体应该足够难了,但我知道一定有人还没玩够,所以后续会增加类似《光环》系列的骷髅头模式,也就是玩家可以选择是否激活某个功能,让游戏更有挑战性。目前规划的有:
- 棍子无法与两侧墙壁发生碰撞,让下落来得更猛烈一些
- 缓冲水体会导电和漏水,让该道具保障安全的同时带有隐患
- 通过声音控制棍子伸缩,给予玩家练气的机会
《光环》可选骷髅头
基于《西游记》的81难特性,后续也会根据每一难的特点做不同类型的游戏。如果你已经通关本游戏,那么恭喜你,取经进度已经完成了1/81。
参考资料
- Unity2D游戏案例:https://github.com/Unity-Technologies/UnityPlayground
- Unity2D物理引擎案例:https://github.com/Unity-Technologies/PhysicsExamples2D
- 半条命2开发者解说(关于游戏设计、测试、玩家心理等开发经验):B站链接
又到了探讨游戏意义的环节
当一个人有着大量空闲时间时,就会忍不住思考做一件事的意义。
在游戏中,山顶既没有礼炮,也没有热辣宝贝,只有一位永远都不满意的甲方,他唯一的乐趣就是出难题并看你受苦。面对与西西弗斯相似的无尽惩罚,唐僧为什么还要爬上去呢?是为了回应唐朝人热切的期待,还是为了完成自己立下的Flag?
立Flag瞬间
甲方的需求就像一盒巧克力,你永远不知道哪些被偷换成了史。笔者不作批判,只是在游戏中将这一现象以戏虐的方式呈现,当玩家遇到无理取闹的要求,或者做着机械重复的工作时,也许他会回忆起这游戏的某一瞬间。值得庆幸的是,在游戏中,只要拼命哭就会有救星出现。
该作品将是我日后的探寻人生意义三部曲之一,它们分别是:
- 《挣点薯条 E.S.C》 :出世的迷茫
- 《唐僧受难记》:入世的困苦
- 《???(Todo)》:脱世的豁达。
这次学到了什么
收获
借着参加GameJam的契机,每次开发都会尝试一些新的游戏类型,顺便还能补全缺漏的知识。本次主要接触并了解了以下方面:
- 剧情对话与分支
- 任务及道具系统
- 2D画面及物理
- 关卡存档
- 成就系统
八分定律
有了第二次GameJam经验后,我发现了一个确保开发速度的技巧:凡事做八分定律。
以前做事的时候,总喜欢凑足十分,一怕自己日后后悔,二怕别人嘲笑。后来人累了,也慵懒了,已经不需要为了证明什么而为难自己。先不说是否真的能达到“十分”的水平,光是用大好时光换那两分,想想就知道不值得。与其一开始尽善尽美,不如给自己留有持续进步的空间。
同理,(线上)社交也能应用八分定律,不会因为太疏远而陌生,也不会因为太亲近而感到压迫。想聊就聊,说完了就静静地挂在朋友的列表清单里。
本次参赛完成初版后,我甚至有充足的时间摸鱼。基本框架和玩法完成度符合要求,地图、对话和彩蛋都通过单元测试,那就行了。虽然画面和音乐丑陋,但追求玩法而不是画面才是真实的GameJam,不是吗?
参赛版的毛坯画风
切记:情深不寿,饱极必伤。
处理废案/废资源
当你在一个模块上花费了大量心血,结果放到游戏里面一看,这性能不行/效果不如意呀!那这时候需要怎么办?把多日的心血扔掉吗?相信每个开发者都不甘心的吧!我的处理方法是:先留着,开发中途也许会想到更加合适的位置。
比如笔者当时花了好长时间研究通过2D骨骼模拟气球软体,最终画面效果很不错,但是很容易穿模导致无法作为承载平台。于是我在后期把它当作小彩蛋,玩家可以肆意玩弄,即使产生bug也不会影响进程。
通过骨骼实现的气球
Solo还是不Solo
本次活动有充足的时间准备,完全可以加入成熟队伍,或者跟美术大牛合作。然而大量GameJam组队经验教训告诉我:世上不存在 [配合&高效&温和] 的六边形队友,光是维持队伍稳定就要花费不少时间心力。与其抱着渺茫的希望赌一把,祈祷队友能力盖世好说话,不如咬咬牙顶硬上,独自走完全程。
但是一个人终究是走不远的,希望下次能和同好的美术或音乐人一起干番大事业。
最后
这篇文章创建自2024.11.04,断断续续竟然花了一个多月才完成。写作真的是比开发还累的活,要解释清楚,保持通畅,还得整活来留住读者,而我能用的就只有字典中的那日渐生疏的几千个字和一些截图。文字创作也是一种特殊的开发项目,感觉可以举办一个七步之内写完800字之类的写作速通Jam🧐。
创建自1月前
另外,寻找愿意试玩的玩家也是个大难题,毕竟这次比赛好看好玩又不伤身的游戏太多了。这里感谢 @神奇的狮子 的耐心游玩并通关,为我提供了非常优质的反馈。
开发途中不断加功能给自己挖坑,也体会了当老板的感觉,不同的是这回没有饼可以吃。