今年我玩了近百個小時的《哈迪斯2》,其中一部分時間是在游戲的文件夾中度過的。
樂趣在于,《哈迪斯2》的大量核心邏輯、技能數值和關卡流程都是用Lua腳本編寫的,這些文件直接以純文本形式存在于游戲目錄中,可讀性很高,任何玩家都可以輕松閱讀、理解。
換句話說,進入磁盤文件尋找contents/scripts,這其中的將近480個文件、50多萬行lua代碼,就像一本細致的游戲設定集,讓你能夠深入了解游戲的各個系統包含有哪些內容,又是怎樣運作起來的。
比如說,眾所周知“哈迪斯”系列以文本量大著稱,十分注重劇情故事和人物塑造,而在這些文件中,就可以找到所有角色的全部對話。
清晰易讀的另一個好處是,不僅便于開發者后期對游戲的維護和拓展,同時也給與玩家更多操作的可能——因為游戲數值清晰可見,所以修改起來無非就是改動下數字,幾乎不費功夫;Mod作者也不需要進行復雜的逆向工程,還能結合開發者留下的注釋作為教程,難怪游戲在玩家社群中被稱為“對Mod”最友好的游戲。
12月剛剛在玩家社區引起熱議的人氣Mod《扎格列歐斯之旅(Zagreus Journey)》就是個挺典型的例子。
這個大型Mod允許玩家直接操縱2代主角墨利諾厄重新體驗1代的全部冒險,不僅全面復刻了1代的關卡、敵人,還調整適配了戰斗機制,全面支持阿卡那牌、忠誓任務、信物等系統,新增了數十種收集資源與大量劇情故事。
如果不是《哈迪斯2》的“代碼底子”足夠好,很難想象MOD作者能夠單槍匹馬在不到一年的時間里完成這么大的工作量。
這當然是游戲的開發商Supergiant Games有意為之。早在2020年的初代《哈迪斯》時期,其就在與玩家交流的問答環節提及:“游戲的許多方面都很容易修改,因為數據都是公開的。”玩家能夠更改所有的文本和數字,并為游戲自由添加內容不受限制。
而哈迪斯的口碑和熱度延續,似乎也一定程度論證了“好代碼”的積極作用:不論從日后持續迭代游戲或是激活玩家參與內容創作的角度,這些“背后功夫”都不是白做,還能夠賦予作品更廣闊的成長空間。
2024年的《小丑牌》拿獎拿到手軟,儼然被行業視為風向標,但其游戲代碼卻遠不如游戲設計那么優美,許多復雜的游戲邏輯,如不同小丑牌的效果疊加、分數計算,都是直接用大量的、嵌套的if-else語句堆砌而成,導致代碼看起來原始且重復。
游戲開發者LocalThunk曾經直言不諱《小丑牌》的底層代碼是用“希望和夢想粘在一起的”,頗有些“俺尋思這可以,沒想到真的能行”的自嘲意味。
當時也有不少遺憾的聲音,表示這樣的底層代碼使得《小丑牌》難以隨著時間的推進進化、拓展機制。
然而在相關討論中,經常是支持者占了上風。一方面,大量的if-else語句在代碼效率上固然不算好,但同時也具備容易理解的優勢,這使得玩家能夠相對輕松地在核心玩法框架不變的前提下添加新的小丑牌。
另一方面,不少游戲開發者都站出來解釋,如果代碼能夠正常運行,那么就沒必要鉆牛角尖。例如一位曾供職過R星的獨立開發者就表示:“要記住目標是發布游戲,而不是編寫最簡潔、最優雅的代碼。”
這些支持者大多認為,只要代碼能跑,便于調試,并且沒有嚴重影響性能,那就已經合格——大多數情況下,只要達成上述條件,玩家也不會在意游戲背后的代碼如何運作。
事實上, LocalThunk最終也是這么達成了自我和解:“它并不完美,但我知道每個東西在哪里,而且我是唯一需要維護它的人,所以這對我來說很有意義。如果它很蠢但是有效,那么它就不蠢!”
LocalThunk原本就只是一位業余游戲開發者,在游戲開發過程中神經一直繃得很緊。根據其自己發表的開發記錄,《小丑牌》完成之前,他已經長期焦慮、失眠,甚至一度因焦慮癥發作去了醫院。
可以想象,在開發者光是為了構思創意、實現創意就已經費盡心神的情況下,很多時候是無暇顧及“精修”代碼的。
不是所有人都擁有高超的編程技術,對于創意工作者,花費時間在代碼上,往往意味著打磨創意、填充內容的時間被擠占。
真要以代碼水平去要求《小丑牌》的話,此消彼長下,游戲的創意水平大概率達不到今天的高度,甚至連游戲能否正常發布都得打個問號——這其實是大多數獨立游戲都會面臨的問題。
很多玩家今天耳熟能詳的作品,實際上都充當過編程的反面教材。《傳說之下》作者在處理對話系統時使用了一個巨大的switch語句,導致游戲中的每一個對話分支、每一個角色的每一句話,幾乎都堆在一個幾萬行的超大函數里;《蔚藍》的主角控制邏輯包含了超過5000行代碼,攀爬、跳躍、沖刺、物理判定、動畫切換,全部擠在一個文件里;初代《我的世界》的Java代碼也是出了名的隨性混亂,致使游戲底層架構臃腫,后續花了多年時間重做。
知名程序員、id So雷火競技ftware創始人之一約翰·卡馬克曾舉證:“我兒子說‘寫代碼不過是if、else和for循環而已’”
離中國玩家更近的一個例子或許是《太吾繪卷》。對不少國內玩家而言,這是一款具有劃時代意義的產品,感情很深,既是因為它當初閃電般的迅速崛起,也是因為在那之后對游戲正式版的漫長等待。
不少人可能還記得,回望2018年,《太吾繪卷》的代碼水平最初是被當作神話或是傳說來傳播的。游戲制作人茄子只看了一個月Unity教程就上去寫游戲,結果“蛐蛐大神保平安,綠皮逆練代碼無BUG一遍過”,游戲順利發布并引發轟動——事實是,游戲出色的成績和一言難盡的代碼水平構成了鮮明的反差,繼而成為其最早的一大記憶點。
如果故事只到這里,那么或許還稱得上因禍得福。但EA上架的《太吾繪卷》和上線時已經趨于完成的《小丑牌》處境并不相同,游戲的玩法框架要更自由,茄子本身也還有更多的想法要去實現。
這就導致原本的代碼無力承載,茄子則在游戲大獲成功后迅速表態希望“把游戲里千瘡百孔的代碼一一修補起來,為大家帶來一個在程序上,更強健、穩定、高效的好玩的游戲”。
后來《太吾繪卷》花了那么大力氣去償還技術債務,大概也是意識到,“差代碼”有時能夠使得一款好游戲更早順利發布,但同時,“好代碼”能創造更多可能,讓一款好游戲變得更好。
2024年與《小丑牌》有并駕齊驅之勢的《動物井》,開發者Billy Basso歷時七年,基于C++自行開發游戲引擎。最終,這款畫面精致、動態光影復雜的2D像素游戲,安裝體積被壓縮到極致的33MB。
由于代碼高度自研且沒有任何冗余的第三方庫,Basso能夠對游戲的各個方面進行完全的掌控,同時也滿足了他構建和理解底層系統的樂趣。
比如游戲中讓玩家印象深刻的視覺效果和光照,他表示沒有采用單一的著色器,而是使用了約50個小的獨立技術,包括動態陰影、邊緣光照、水體效果、流體系統等等。
最終,這種優美的底層代碼為游戲的解謎提供了物理層面的深度,也從根本上影響了游戲核心的解謎機制。
玩家或許不會直接審視代碼的好壞,但更好的代碼確有可能為玩家帶來更為優質的游戲體驗和更深刻的印象,就像Basso曾表示《動物井》還可以做到更小:“如果我知道人們會如此印象深刻,我可能會更加努力地縮小它”。
也可以說,當游戲的核心玩法樂趣高度依賴代碼的復雜功能時,后者的存在感難免愈發明顯。
高自由度的《Noita》以技術著稱,游戲只設定下物質的基本規則,如水遇火變蒸汽,酸腐蝕木頭,剩余的一切交給玩家自行探索,從中誕生出了各種超乎預想的玩法和戰術。
其玩法核心的背后是自研的“Falling Sand”引擎:屏幕上的每一顆像素——無論是流動的液體、燃燒的火焰還是被炸碎的巖石——都具備獨立的物理屬性和化學反應邏輯。
實現這種“像素級物理”需要極高水平的多線程架構和數學建模,相應的,開發團隊設計了一套極其穩健的實體組件系統(ECS),使得成千上萬個具備物理屬性的像素點可以相互碰撞、傳導溫度、發生相變。
從這個角度看,代碼已經不止是實現創意的工具,而是作為創意本身與玩家發生交互。
放在過去,好的代碼往往是隱形的。就像一個人身體健康,那么一切都自然而然,只有哪個部位出了毛病,才會清晰感知到其存在。
但隨著游戲品類的豐富,開發者與玩家之間的關系拉近,代碼時不時也會浮出水面,作為開發者“研發態度”的象征,進而影響到產品的對外形象。
像《戴森球計劃》早期做技術分享,就有玩家“恍然大悟”,都是模擬類游戲,為何戴森球十分流暢,隔壁天際線卻卡到不行。
包括前面提到的哈迪斯,也是因此收獲玩家盛贊,即便玩家可能看不懂代碼,但至少讀得出誠意。
隨之而來的是,伴隨著游戲的長線運營,“優美的代碼”也成為需要持續維護的對象。
舉個例子,好評如潮的模擬工廠流水線游戲《異星工廠》,至今保留著他們的Factorio Friday Facts每周博客文章,目前已更新到400多篇,事無巨細地與玩家分享詳細的更新內容、開發見解、新功能和游戲機制,技術細節涵蓋從引擎改進到代碼效率提升的方方面面。
我在reddit上翻到一篇關于“好代碼”重要性的帖子,一位小有名氣的游戲制作人Tomas Sala和網友論辯了十來個回合,幾乎快演變為人身攻擊,依舊難分勝負。
Sala堅持“創意落地”優先于“代碼優化”,功能性雖然重要,但更關鍵的是向玩家提供一種獨特的體驗。
以他自己的作品《堡壘:獵鷹戰紀》為例,就是以一種“又快又野”的實用方式寫出來的,結果營收超過100萬——所以不要浪費時間在“好看”的代碼上,為了在現代游戲市場中生存,需要盡快且低成本地驗證思路。“Steam上95%的游戲不需要維護,因為并不成功,糾結于代碼完全是白費力氣”。
網友則反擊,代碼做得越好,迭代與打磨玩法樂趣就更容易。優化代碼、提升代碼能力,本質上是一種對未來的投資,既能為今后作品做更好的鋪墊,也能有效避免后續的技術債務。
這背后倒是讓人體會到兩種并行的市場背景。一邊是3A沒落,獨立游戲來到行業地位高點,從業人員更加崇尚“創意為先”。對于以機制創意或敘事驅動的作品,“能跑就行”的代碼性價比高,因為其核心魅力在于“點子”,代碼只是完成創意的工具。
另一邊,長線運營成為行業常態,保持游戲活力、維護玩家關系成為了大趨勢。再加上AI技術的發展,技術普惠進一步降低了玩家參與游戲內容創作的門檻,這又對游戲代碼提出了更高的要求。