佛曰:那南贍部洲者,縱情聲(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月前
另外,尋找願意試玩的玩家也是個大難題,畢竟這次比賽好看好玩又不傷身的遊戲太多了。這裡感謝 @神奇的獅子 的耐心遊玩並通關,為我提供了非常優質的反饋。
開發途中不斷加功能給自己挖坑,也體會了當老闆的感覺,不同的是這回沒有餅可以吃。