說(shuō)實(shí)話(huà),我一開(kāi)始是拒絕的。
作為一個(gè)在Firaxis Games混過(guò)的敘事設(shè)計(jì)師,我參與過(guò)《漫威暗夜之子》《文明7》這種大項(xiàng)目,見(jiàn)過(guò)真正的工業(yè)級(jí)管線(xiàn)長(zhǎng)什么樣——幾百號(hào)人、幾十層文件夾、開(kāi)個(gè)引擎要等泡完一杯咖啡。所以當(dāng)同事跟我說(shuō)"你去試試Godot吧,30天能做個(gè)游戲"的時(shí)候,我的第一反應(yīng)是:這開(kāi)源小引擎,能行嗎?
![]()
但2023年Unity那個(gè)按安裝量收費(fèi)的風(fēng)波之后,Godot確實(shí)火了一把。《殺戮尖塔2》《黃金偶像案》《磁帶妖怪》這些口碑作都選了它,連EA都用魔改版Godot給《戰(zhàn)地6》做了傳送門(mén)地圖編輯器。100MB的體積,秒開(kāi),不要錢(qián),沒(méi)有大公司管著——聽(tīng)著像是獨(dú)立開(kāi)發(fā)者的夢(mèng)中情引擎。
問(wèn)題是,它對(duì)我這種只寫(xiě)過(guò)劇本、沒(méi)正經(jīng)敲過(guò)代碼的敘事型選手友好嗎?
我決定賭一把。30天,從零開(kāi)始,做個(gè)能玩的游戲。哭還是笑,月底見(jiàn)分曉。
Day 1:游戲?什么游戲?
下載Godot花了不到兩分鐘。打開(kāi)之后我愣了一下——界面干凈得不像話(huà),沒(méi)有滿(mǎn)屏的浮動(dòng)窗口,沒(méi)有八層嵌套的菜單。但干凈也意味著:我得自己決定從哪開(kāi)始。
我盯著空白項(xiàng)目看了十分鐘。做敘事的人有個(gè)毛病,總想先寫(xiě)世界觀(guān)、角色小傳、三幕結(jié)構(gòu)。但Godot不在乎我的三幕結(jié)構(gòu)。它問(wèn)我:你的第一個(gè)場(chǎng)景是什么?你的玩家能按哪個(gè)鍵動(dòng)?
于是我做了個(gè)決定:這30天,我不寫(xiě)文檔。想到什么做什么,爛就爛,先讓東西跑起來(lái)。
第一個(gè)晚上,我搞出了一個(gè)能左右走的小方塊。沒(méi)有美術(shù),沒(méi)有動(dòng)畫(huà),就是一個(gè)色塊在灰背景上平移。但我按鍵盤(pán)它真的動(dòng)了——這種反饋比寫(xiě)十頁(yè)設(shè)定稿都爽。
Day 3:GDScript,我的新朋友/敵人
Godot用的是自家語(yǔ)言GDScript,語(yǔ)法跟Python很像。我學(xué)過(guò)一點(diǎn)Python,所以理論上應(yīng)該無(wú)縫銜接。實(shí)際上?
第一個(gè)bug花了我四小時(shí)。我想讓小方塊碰到墻停下來(lái),結(jié)果它穿墻了,然后飛出了屏幕邊界,然后游戲崩潰了。查文檔、翻論壇、看教程視頻——Godot的社區(qū)確實(shí)活躍,但答案散落在Reddit帖子、Discord記錄和某個(gè)2019年的YouTube視頻里。
最后發(fā)現(xiàn)是我把碰撞體的位置放錯(cuò)了,偏移了一個(gè)像素。
一個(gè)像素。
這種時(shí)刻你會(huì)懷疑人生。但換個(gè)角度,如果我在Unity里遇到同樣的問(wèn)題,解決流程可能更長(zhǎng)。Godot的節(jié)點(diǎn)系統(tǒng)很直觀(guān),每個(gè)對(duì)象是什么、父子關(guān)系如何,一眼能看懂。它不會(huì)幫你避免低級(jí)錯(cuò)誤,但至少讓你能快速定位到錯(cuò)在哪。
Day 7:終于有個(gè)像樣的畫(huà)面了
第一周結(jié)束,我決定認(rèn)真做個(gè)美術(shù)風(fēng)格。不是找外包,是自己畫(huà)——像素風(fēng),16x16的精靈,配色直接抄我桌上的臺(tái)燈。
Godot的2D工具集意外地順手。動(dòng)畫(huà)系統(tǒng)不用寫(xiě)狀態(tài)機(jī)代碼,直接在編輯器里拖幀、設(shè)過(guò)渡、調(diào)速度。粒子效果?加節(jié)點(diǎn),調(diào)幾個(gè)參數(shù),火星子就飄起來(lái)了。這些功能在大引擎里當(dāng)然也有,但往往藏在第三層菜單后面,或者需要導(dǎo)入插件。
我做了個(gè)核心機(jī)制:玩家控制一盞提燈,在黑暗中探索,燃料會(huì)隨時(shí)間消耗,找到火源才能續(xù)命。很簡(jiǎn)單,但循環(huán)成立——走太遠(yuǎn)會(huì)死,太保守又找不到出口。
那天晚上我玩到凌晨?jī)牲c(diǎn)。自己的游戲。
Day 14:聲音,被低估的魔鬼
第二周我開(kāi)始加音頻。Godot內(nèi)置了簡(jiǎn)單的混音器,但找免費(fèi)音效比寫(xiě)代碼還折磨。我試了五個(gè)不同的"腳步聲"素材,最后選了一個(gè)像踩爆漿蛋糕的——因?yàn)槠渌膫€(gè)要么太脆像高跟鞋,要么太悶像潛水。
背景音樂(lè)更頭疼。我不會(huì)作曲,于是用了開(kāi)源的生成工具,輸入幾個(gè)參數(shù),導(dǎo)出一段循環(huán)。結(jié)果聽(tīng)起來(lái)像微波爐故障。
最后妥協(xié):環(huán)境音為主,風(fēng)聲、火噼啪、遠(yuǎn)處不明生物的咕嚕聲。沒(méi)有旋律,但氛圍對(duì)了。敘事設(shè)計(jì)師的本能救了我——有時(shí)候留白比填滿(mǎn)更有張力。
Day 21:那個(gè)差點(diǎn)讓我棄坑的晚上
第三周發(fā)生了兩件事。一是我終于做出了第一個(gè)完整關(guān)卡,從起點(diǎn)到終點(diǎn)能打通,有謎題有緊張感。二是我嘗試加存檔功能,然后整個(gè)項(xiàng)目崩了。
Godot的存檔系統(tǒng)理論上很簡(jiǎn)單:把游戲狀態(tài)寫(xiě)成字典,存成文件,讀取時(shí)還原。但我沒(méi)搞懂資源路徑的寫(xiě)法,存檔文件寫(xiě)到了系統(tǒng)臨時(shí)文件夾,下次啟動(dòng)找不到了。玩家進(jìn)度全丟。
我花了六小時(shí)排查,最后在一篇俄語(yǔ)論壇帖子里找到答案。那一刻我真的想關(guān)電腦去睡覺(jué),明天再說(shuō),后天再說(shuō),永遠(yuǎn)不說(shuō)。
但30天的賭約在腦子里響。我喝了杯咖啡,重寫(xiě)了一遍存檔邏輯,測(cè)試了十次,確認(rèn)進(jìn)度真的能被留住。
那個(gè)晚上我學(xué)會(huì)一件事:獨(dú)立開(kāi)發(fā)沒(méi)有"明天再說(shuō)"的選項(xiàng)。要么現(xiàn)在解決,要么項(xiàng)目死掉。
Day 28:打磨,或者假裝在打磨
最后兩天,我在做"拋光"——這個(gè)詞聽(tīng)起來(lái)高級(jí),其實(shí)就是調(diào)數(shù)值、修錯(cuò)別字、確保按鈕不會(huì)點(diǎn)穿到地圖外面。提燈的燃料消耗速度調(diào)了十七版,太快玩家焦慮,太慢又沒(méi)壓力。最終選了中間偏快的那個(gè),讓每次探索都有賭的成分。
我還加了一個(gè)隱藏結(jié)局。不是多復(fù)雜的分支,就是如果玩家全程不點(diǎn)燃任何額外火源,直接沖向終點(diǎn),會(huì)看到不同的畫(huà)面。敘事設(shè)計(jì)師的執(zhí)念——哪怕是個(gè)小游戲,也要有"選擇"的幻覺(jué)。
Day 30:它活了
最后一天下午,我把游戲打包上傳到Itch.io。文件不到50MB,加載比大多數(shù)網(wǎng)頁(yè)游戲還快。我發(fā)給三個(gè)朋友測(cè)試,兩個(gè)通關(guān)了,一個(gè)卡在第二關(guān)找不到路——這正是我想要的效果,有點(diǎn)難,但不至于勸退。
游戲叫《The Last Lamplighter》。沒(méi)有劇情動(dòng)畫(huà),沒(méi)有配音,沒(méi)有成就系統(tǒng)。但你能走路,能點(diǎn)燈,能死,能贏。30天前這玩意兒不存在,現(xiàn)在它存在了。
這30天教會(huì)我什么
先說(shuō)Godot本身。它確實(shí)能競(jìng)爭(zhēng)——不是全方位吊打Unity/Unreal,而是在特定場(chǎng)景下更合理。2D游戲、小型團(tuán)隊(duì)、快速迭代、預(yù)算為零,這些條件下Godot的效率驚人。節(jié)點(diǎn)系統(tǒng)讓非程序員也能理解項(xiàng)目結(jié)構(gòu),輕量體積意味著隨時(shí)隨地能打開(kāi)改兩筆。
但它也有邊界。3D功能比不過(guò)Unreal,資產(chǎn)商店的生態(tài)比不過(guò)Unity,某些高級(jí)功能需要自己動(dòng)手寫(xiě)插件。如果你是做次世代畫(huà)面的團(tuán)隊(duì),Godot不是答案。但如果你是 solo dev,或者三五個(gè)人想驗(yàn)證一個(gè)玩法原型,它可能是目前最友好的選擇。
再說(shuō)我自己。在大團(tuán)隊(duì)待久了,會(huì)忘記"從零到一"是什么感覺(jué)。文明7的某個(gè)文明特性可能要經(jīng)過(guò)二十輪會(huì)議、三個(gè)月迭代、五十個(gè)人的簽字,才能在玩家面前出現(xiàn)。而《The Last Lamplighter》里那個(gè)提燈火焰的閃爍頻率,是我凌晨?jī)牲c(diǎn)憑直覺(jué)調(diào)的,沒(méi)問(wèn)過(guò)任何人。
兩種模式?jīng)]有高下。但30天的 sprint 讓我重新摸到創(chuàng)作的原始沖動(dòng)——不是因?yàn)镵PI,不是因?yàn)橥婕艺{(diào)研數(shù)據(jù),就是因?yàn)?我想看看這個(gè)能不能行"。
最后給想試試的人
如果你也是寫(xiě)故事的、畫(huà)畫(huà)的、做設(shè)計(jì)的,想自己做游戲但一直被"要學(xué)編程"嚇退,我的建議是:下Godot,給自己設(shè)個(gè)死線(xiàn),先做坨屎出來(lái)。
真的。第一版一定會(huì)很爛。我的第一版連屎都不如,是個(gè)穿墻的色塊。但色塊能動(dòng)的那一刻,你會(huì)上癮。之后每一周,你都會(huì)驚訝于上周的自己有多菜——這就是進(jìn)步。
30天不夠做3A,但夠證明一件事:你能做完一個(gè)東西。從開(kāi)頭到結(jié)尾,閉環(huán)。這個(gè)經(jīng)驗(yàn)比任何教程都值錢(qián)。
至于《The Last Lamplighter》?它現(xiàn)在躺在Itch.io上,免費(fèi),能玩,有bug但我懶得修了。畢竟新的30天已經(jīng)開(kāi)始,我在想下一個(gè)游戲該做什么。
也許是個(gè)關(guān)于時(shí)間循環(huán)的敘事解謎?或者多人合作的提燈探險(xiǎn)?
先讓我把GDScript的文檔再翻一遍。
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶(hù)上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.