我是如何從零開始手搓一個獨(dú)立游戲并上架Steam的
每一個游戲玩家心中,都有一個自己做一款游戲的夢。費(fèi)勁千辛萬苦后,我成功制作了一款獨(dú)立游戲并在2025年1月1日上架了Steam。
本文既是對這個過程的一種紀(jì)念,也是對游戲制作這個話題留下一些自己的思考和總結(jié),如果能讓后來者少踩幾個坑,就更好了。
我將按時間線索將整個游戲制作和發(fā)行過程展現(xiàn)出來,文章較長,感謝你的耐心閱讀。
一、源起2019
我是一個80后,在90年代伴隨著電子游戲成長起來的一代人,在讀書的時候曾經(jīng)有一段時間沉迷游戲,玩三國志和文明系列玩到深夜。
我父親實(shí)在看不下去了,對我說了一句話:“玩游戲厲害算什么,有本事自己做一個啊”。當(dāng)時還小,也沒有能力制作一款游戲,可能是年少時的那種不服氣吧,這句話我就一直記在了心里。
后來參加工作了,和大多數(shù)社畜一樣,每天累得跟狗一樣,回家就只想躺著休息,連打開電腦玩一把游戲的興趣都沒有了。
2018年下半年,Steam上的獨(dú)立游戲中國式家長火熱,我正好也玩到了這款游戲,并向我的朋友推薦了它。
然后在2019年春天,我晚上加班加得心煩意亂,工作堆積如山,一眼瞥見了加班了一小會兒就想溜的胡大胖同學(xué),我說: “你陪我加班吧,我做完這點(diǎn)事情,我們就玩暗月來襲“,然后胡大胖同意了。
暗月來襲是當(dāng)時很火的一款DOTA2地圖,我們之前從來沒有通關(guān)過,就在那個晚上,我們打到了歷史最佳記錄-倒數(shù)第二關(guān)。
然后在黎明到來前,胡大胖說:“加班其實(shí)是有一定概率猝死的?!?/p>
我說:“要不我們做一款游戲吧,就叫中國式加班?!?/p>
胡大胖表示同意,然后我們一起構(gòu)思了這么一個特別的游戲;當(dāng)時胡大胖還并不知道,他將是這個加班游戲的主角原型。
所以在2019年五月,我初始化了這個游戲項目的Git倉庫。
二、萌新的進(jìn)擊
雖然對制作游戲一無所知,但是我知道很多游戲引擎,比如rpgmaker,cocos2d,unity,虛幻3,當(dāng)時實(shí)在沒有心思再投入時間學(xué)習(xí)這些引擎。
所以我就在想,能不能用我現(xiàn)有的技術(shù)棧來做這個游戲?
我就決定先用前端(Vue)+Electron先做一個DEMO出來。
然后DEMO很快就出來了,它大概長這個樣子:
點(diǎn)擊新建游戲后出現(xiàn)幾個對話,就這么簡單。
懵懂間,我意識到了自己需要制作一個游戲腳本引擎系統(tǒng),不過作為一個DEMO,我還沒有把腳本引擎添加進(jìn)來。
一切似乎都很順利,然后我開始盤算我還需要什么東西才能完成這個游戲,很明顯,我需要2D美術(shù)資源用來表達(dá)人物立繪和場景,需要有音效和背景音樂。
我決定先從最簡單的音效和背景音樂開始,音效在網(wǎng)上免費(fèi)可商用的很多,背景音樂我選擇直接從audiojungle購買,總共花了800人民幣左右。
然后是美術(shù)資源。我從淘寶上找了一個畫手來繪圖,當(dāng)時想得很好:一邊制作游戲,一邊按照規(guī)劃輸出美術(shù)資源。
我當(dāng)時是以200一張的價格向畫手定制的,我們很快敲定并輸出了基礎(chǔ)的UI圖。
在輸出場景和人物圖時,我和畫手都付出了相當(dāng)大的代價。
當(dāng)時我們輸出一張圖需要以下幾個流程:
- 我文字描述想要的場景/人物特色,盡可能地詳細(xì),并配上例圖
- 畫師制作線稿
- 我和畫師敲定線稿,如果和我的想法有偏差,會對線稿進(jìn)行調(diào)整
- 畫師細(xì)化線稿并上色
- 畫師根據(jù)我的反饋,對成品進(jìn)行優(yōu)化和調(diào)整
剛開始還不覺得,但是后來我發(fā)現(xiàn),這樣出一張圖的成本實(shí)在是太大大大大大大啦!
當(dāng)時我們做了一些這樣的圖:
然后我意識到這樣一個問題,我根本沒有足夠的資源去得到這些我想要的美術(shù)素材,所以在付出了8700元之后,我選擇了將這個項目封存,不再繼續(xù)。
不管是時間成本還是金錢成本,都不是當(dāng)時的我能夠承受得了的。
三、黎明的曙光
就這樣又過了幾年,我時不時還想起這個游戲項目來,帶著深深地遺憾,因為我從來不是一個喜歡爛尾的人,但是人到中年,也學(xué)會了接受很多的客觀現(xiàn)實(shí)。
轉(zhuǎn)機(jī)出現(xiàn)在2022年,stable diffusion橫空出世,同年12月,chatgpt正式上線,我很快意識到,也許我現(xiàn)在有機(jī)會完成中國式加班了。
在研究了sd很久之后,我確信這個東西生成的圖片即便存在這樣或那樣的瑕疵,但卻是我唯一能夠低成本獲得2D美術(shù)資源的方法。
于是我決定重啟中國式加班項目。
重啟的第一件事,我決定制作一個路線圖表格,這是這個表格在游戲最終完成后的樣子:
我決心按照這個表格嚴(yán)格執(zhí)行,立馬開始了游戲玩法設(shè)定的工作。
在設(shè)計玩法時,我考慮到了自己的精力有限,所以把整個游戲的玩法設(shè)定得特別簡單,心里想著玩法的短板可以用豐富的劇情去補(bǔ)充,游戲類型確定為SLG模擬經(jīng)營。
其實(shí)對于獨(dú)立游戲而言,劇情代表著巨大的工作量,不過對于當(dāng)時的我而言,并沒有這種認(rèn)知。
我用自學(xué)不到一個星期的Adobe XD嘗試制作了這樣一個原型,以下是抽取的幾張原型圖片:
這個原型很粗糙,它的最大的價值就是把我腦海里這個游戲的樣子用圖片的形式展現(xiàn)出來,并且我知道后續(xù)原型里這些設(shè)定不會有特別大的改動了。
四、時代不同了,大人
我還需要徹底解決美術(shù)素材的問題,所以我特意購買了一臺電腦,因為預(yù)算有限,顯卡是用的4060Ti。
然后我開始嘗試使用sd進(jìn)行AI出圖,在這個過程中,我遇到的最大的問題是,如何保持人物/場景風(fēng)格的一致性,想了很多辦法,最終采用的是在prompt前置風(fēng)格描述的方式。
最開始的時候,我是把出圖prompt用中文描述出來,再用DeepL翻譯為英文,最后在sd里煉丹出圖。
但是這種方式有個弊端,對prompt的要求非常高,寫prompt也不是一件容易的事,然后我想了個辦法,讓Chatgpt去幫我寫sd的prompt,Claude出來之后我就把Chatgpt換成了Claude。
AI寫的prompt非常詳細(xì),sd也能更好的理解prompt,但是仍有一個問題,就是無法生成同一場景或人物的細(xì)微變化,比如一個人在不更換服裝和發(fā)型的情況下,要出一張不同動作的圖,這就很難,即便我用了ControlNet去約束,新出來的圖,在服裝或發(fā)型上,總有些細(xì)微的差別,無法做到一致性。
所以我干脆放棄了人物立繪的動作多樣化,直接一個人物一張圖用到大結(jié)局,這樣就簡單多了。
解決了美術(shù)素材的問題,我開始從0研發(fā)一個簡單的游戲引擎,說是引擎,但其實(shí)最核心的部分只有一個,就是游戲事件腳本引擎,因為整個游戲都是以事件驅(qū)動的。
很快我就構(gòu)建好了事件腳本系統(tǒng),我把事件腳本分為兩部分,一部分是事件條件,一部分是事件內(nèi)容,我把它們都寫入一個Sqlite數(shù)據(jù)庫中,Sqlite的數(shù)據(jù)庫其實(shí)就是一個文件,也比較簡單且易于管理。
事件條件主要就是人物的一些屬性和時間/前置任務(wù)等等,單獨(dú)使用了一張表保存。
事件內(nèi)容要稍微復(fù)雜一些,我基于Markdown設(shè)計了它的基礎(chǔ)語法,最終看起來是這樣的:
1. 對話
新垣結(jié)衣: 今天我?guī)е?*里美醬**一起來的噢.2. 場景切換
<帝企鵝大樓3301>
<過場場景>$ /* 隱藏UI */
<游戲結(jié)束>+ /* 直接切換 */
<> /*空場景, 延遲事件執(zhí)行1s*/3. 定義分支
# 相信陌生人
陌生人:你好,我是陌生人.4. 選項跳轉(zhuǎn)分支
1. 要相信他嗎?@相信陌生人
2. 不相信他!@不相信陌生人
3. (角色屬性.幸運(yùn) > 80) ? 我想賭一把@相信陌生人5. 場景加載/取消NPC
* NPC1
* NPC2
~ NPC36. 跳轉(zhuǎn)分支
(角色屬性.上級滿意度 < 20) ? @條件跳轉(zhuǎn)某分支
(角色屬性.名字 == “新垣結(jié)衣”) ? @條件跳轉(zhuǎn)某分支
(系統(tǒng)屬性.隨機(jī)數(shù) < 0.7) ? @隨機(jī)跳轉(zhuǎn)某分支 /* 70%概率*/ @直接跳轉(zhuǎn)某分支 7. 畫外音 > 平等地剝削勞動力,是資本的首要的人權(quán)。8. 提示
[**里美醬**對你的好感度提升了]+
[你受到了暴擊傷害]-9. 屬性修改
(系統(tǒng)屬性.某角色 = 解鎖)
(角色屬性.精神上限 = $ + 100)
(角色屬性.底層螺絲釘 = 已激活@3天)
(角色屬性.休息日23點(diǎn) = 睡覺*) /* 帶*號為鎖定卡牌 */10. 播放音樂
{平靜1.mp3}
然后我再根據(jù)事件腳本的語法去實(shí)現(xiàn)整個游戲引擎,當(dāng)時為了學(xué)點(diǎn)新東西,放棄了第一個DEMO時使用的Vue,轉(zhuǎn)而使用了React。
其實(shí)我對React一無所知,但是好在有Github copilot的幫助,很快就上手了
整個游戲引擎前后耗時約6個月,然后我用這個引擎又做了一個DEMO版本,以測試事件腳本引擎能否正確運(yùn)行。
結(jié)果很幸運(yùn),它真的可以運(yùn)行起來。
五、真正的阻力
然后我興高采烈地開始寫游戲大綱,包括游戲背景大綱和游玩角色大綱。當(dāng)時計劃的游玩角色總共有四個,分別是胡圖巴(倔強(qiáng)的韭菜),肖望榮(中年悲歌),孫西里(小目標(biāo)),趙浩(拖延癥患者的夢),第四個角色趙浩其實(shí)就是以我自己為原型設(shè)計的。
大綱寫好以后我開始按照原定計劃為每一個角色劇本寫配套的小說,第一個角色胡圖巴的配套小說寫了幾萬字后,我突然感覺,這東西寫不完了。
人這種生物一旦在付出努力未能實(shí)時獲得反饋時,就會變得極其懶惰。
我也是這樣,我就在步子邁大了小說完不成了和我再抽點(diǎn)時間寫寫之間反復(fù)徘徊。
最終進(jìn)度非常緩慢。
后來有一天我實(shí)在忍不了了,我就想,這個小說真的是有必要的嗎?
我是在做游戲,又不是在寫小說。
所以我干脆把整個小說系統(tǒng)在游戲里給去掉了,去掉之后渾身舒坦,游戲研發(fā)進(jìn)度飛速發(fā)展。
六、完成和完美
經(jīng)過了一段時間劇情腳本編寫之后,我又開始偷懶了,因為我感覺自己的的確確沒有享受做游戲這種事。
做游戲和玩游戲完全不一樣,做游戲不止很困難,并且你獲取不到玩游戲的那種快樂,也就是在游戲交付測試之前,你基本得不到什么正向的反饋。
然后我在做加班游戲的時候開始摸魚。
這一摸又是很久,久到我自己都受不了了,我打開手機(jī)寫下了這樣幾段話:
中國式加班從去年到今年已經(jīng)兩年了還沒完成,需要進(jìn)行反思和總結(jié),找到加快開發(fā)進(jìn)度的方法。
## 原因
1. 惰性
人總是趨向于做容易的事,容易取得成就感的事,所以把空閑時間大量花在了看視頻玩游戲上
2. 難以進(jìn)入心流
開發(fā)過程中無法全神貫注,并且不享受游戲開發(fā)的過程,創(chuàng)作和和玩游戲的感覺完全不一樣,無法受到實(shí)時激勵
3. 沒有緊迫感,沒有計劃
整個事情沒有時間節(jié)點(diǎn)的壓力,現(xiàn)在時間比較充足,也沒有經(jīng)濟(jì)上的壓力,就無法高效地推進(jìn)任務(wù)
## 解決方法
1. 加長那些簡單獲取多巴胺的事項的路徑
比如刪除游戲,限制抖音等app的使用時間,解放碎片時間,使得專注時間更長
2. 設(shè)定截止日期和任務(wù)計劃
每天回顧這個計劃并堅定按照計劃的時間和工作量去推進(jìn),盡可能的分解大的任務(wù)為小的任務(wù)
3. 讓創(chuàng)作的過程變得更有趣
讓創(chuàng)作游戲腳本的過程更簡單并且更有趣,甚至像玩游戲一樣去做游戲,或者邊做邊玩
4. 將做游戲這個事放入重要且緊急的象限里
放棄對部分品質(zhì)和細(xì)節(jié)的追求,尤其是場景圖和人物圖等資源的生成,把做游戲這件事設(shè)定為目前最重要且需要快速完成的事,放棄對銷售量的預(yù)期,只專心到“完成它”這一件事上,哪怕因為過于粗糙導(dǎo)致最終玩家評價不好,至少這件事我“完成了”,也許有瑕疵,也許壓根就不好玩,但是“完成了”對我而言就很有意義
5. 使用合作的力量,引入其他人參與,以更多的空間力量去執(zhí)行任務(wù)
6. 把路線圖表格保持打開狀態(tài),隨時提醒自己,根據(jù)進(jìn)度更新路線圖,預(yù)計好工期
這樣游戲的研發(fā)進(jìn)度再一次飛速推進(jìn),到了接近胡圖巴的游戲大綱中最后一段主線劇情時,我又陷入了畏難情緒中。
我一想到就算這個做完了,還有3個游戲角色要做,我就渾身難受,覺得根本完不成了。
然后我找胡大胖吐槽,說做游戲好難啊,胡大胖說,那你就做簡單一點(diǎn)啊,先做出來再說。
我想了想,要怎么才能加快整體的進(jìn)度呢? 要不直接減少可游玩的角色吧。
然后我就把除了胡圖巴之外的其他三個角色都給刪掉了。
這下進(jìn)度條狂奔,直接到了90%。
然后我開始趕工,只以完全主線劇情為唯一目標(biāo),原本計劃了很多的分支劇情,不想做就不做了吧。
就這樣游戲主體很快就完成了。
七、AI音樂
給游戲設(shè)置背景音樂的時候,我一開始仍然是使用的幾年前購買的音樂素材包,后來一想,時代已經(jīng)變了,為什么不用AI來生成游戲的背景音樂呢?
說干就干,我注冊并購買了Suno的會員,花費(fèi)10$,然后生成了樂器伴奏的純音樂作為游戲的背景音樂。
后來我想,要不要在游戲的主菜單界面放一首人聲的主題曲呢?
我覺得這個主意很棒,并且很簡單,成本又低,因為Suno剛好也支持生成人聲的歌曲,于是我開始寫歌詞。
一開始的時候想讓claude幫我寫一首押韻的歌詞,但是AI生成的歌詞達(dá)不到我預(yù)期的效果。
于是我決定自己寫一首歌,歌名就叫《天命打工人》,最終完成的歌詞如下:
verse 1:
清早鬧鐘又響起
地鐵里面深呼吸
打卡上班很著急
工作已在等著你chorus:
九九六,九九六
熬夜加班傷身體
零零七,零零七
摸魚才是硬道理
九九六,九九六
咖啡續(xù)命撐到底
零零七,零零七
我要變成萬人敵verse 2:
這個需求很簡單
怎么實(shí)現(xiàn)我不管
老板畫餅要吃飽
生活娛樂全扔掉chorus:
九九六,九九六
熬夜加班傷身體
零零七,零零七
摸魚才是硬道理
九九六,九九六
咖啡續(xù)命撐到底
零零七,零零七
我要變成萬人敵bridge:
打工人,打工魂
打工人打開一張門
打工實(shí)在太費(fèi)神
打工人要做人上人verse 3:
凌晨四點(diǎn)的夜光
照亮回家的方向
忘了加班的煩惱
生活多一點(diǎn)希望ending:
九九六,九九六
熬夜加班傷身體
零零七,零零七
摸魚才是硬道理
九九六,九九六
咖啡續(xù)命撐到底
零零七,零零七
我要變成萬人敵
當(dāng)我用Suno生成歌曲時,意外出現(xiàn)了,Suno生成的中文人聲歌曲總是有部分吐詞不清楚,而且有一些詞會怪異地使用粵語的發(fā)音(推測Suno使用了很多粵語歌曲進(jìn)行訓(xùn)練),不管我怎么調(diào)整都沒有用,我甚至用帶聲調(diào)的拼音作為歌詞放Suno里生成,也還是不行。
然后我想,外國的月亮也不圓,我們國內(nèi)有沒有同類的AI音樂網(wǎng)站呢?
欸,還真讓我找到了,就是國內(nèi)的海綿音樂(字節(jié)系),我用同樣的歌詞貼進(jìn)海綿音樂了,不到5分鐘我就得到了發(fā)音清楚的搖滾音樂,雖然海綿音樂生成的音樂沒有Suno那么音色飽滿且充滿細(xì)節(jié),但是勝在發(fā)音清楚,讓人有聽下去的欲望。
如果想聽一聽的,可以打開這個抖音鏈接試聽:
https://v.douyin.com/iyMKtt8p/
八、多國語言翻譯
最后要做的是多國語言翻譯,因為一開始我就使用了i18n庫,所以這部分工作主要就是翻譯i18n字符串。
我為游戲提供了幾種語言,簡體中文,繁體中文,英語,日語。
我嘗試使用claude去翻譯json字符串,經(jīng)過一系列嘗試后,使用以下prompt獲得了很好的效果:
以下是一些游戲的i18n對話文本,將其value翻譯為英文,請不要修改key,翻譯后的內(nèi)容需要全年齡段適用,請一次性翻譯完成,請務(wù)必一次性翻譯完成,文本中的標(biāo)記或其它可以轉(zhuǎn)義的標(biāo)記請對其進(jìn)行保留,輸出內(nèi)容為json,用inline code的方式輸出
但是手動調(diào)用claude去翻譯的工作量實(shí)在是太大了,我就想能不能調(diào)claude 的api呢? 結(jié)果卡在了付費(fèi)這一步,沒有合適的外卡進(jìn)行支付,我的國內(nèi)visa卡并不能支付claude的費(fèi)用。
經(jīng)過一番搜索,我找到了rapi的claude api服務(wù),其實(shí)這個服務(wù)的提供者也只是轉(zhuǎn)發(fā)了claude的api服務(wù)(不知道這樣是不是違反claude api的tos的),好處是rapi的支付渠道很好,可以接受國內(nèi)的visa卡付款。
搞定了api,我直接在copilot的幫助下寫了一個python腳本去批量地使用我研究出的prompt對i18n文本進(jìn)行翻譯。
這個腳本在翻譯完后還會自動檢查是否有漏掉沒有翻譯的i18n key。
然后翻譯工作就簡簡單單完成了,前后沒有超過半天。
九、安卓移植
這個時候我其實(shí)就已經(jīng)想發(fā)布內(nèi)測版本,把游戲發(fā)給我的朋友們玩了。
但是當(dāng)我表達(dá)出這個意圖時,他們紛紛表示,坐在電腦前玩游戲太奢侈了,有沒有手機(jī)版?
好吧,雖然不打算發(fā)行移動版本,但還是移植一個安卓版本吧。
然后我學(xué)習(xí)了Cordova的使用,并打出了一個apk包。
放手機(jī)上運(yùn)行,直接白屏,想想也對,移植工作可不只是打包apk這么簡單。
我需要把原來所有涉及到文件讀取的地方,改造成調(diào)用安卓API。
因此我重新設(shè)計了Files庫,區(qū)分對待PC和安卓,游戲中所有涉及到文件的地方統(tǒng)統(tǒng)使用這個Files庫。
折騰了兩天之后,游戲終于可以在手機(jī)里運(yùn)行了。
十、朋友圈內(nèi)測
我興高采烈地發(fā)了一條關(guān)于游戲內(nèi)測的朋友圈:
第一時間就發(fā)給了胡大胖,結(jié)果胡大胖說,運(yùn)行白屏。
我當(dāng)時的表情是: ????????????
我的第一反應(yīng)是:?在我的機(jī)器上好好的啊
一問才知道,他的手機(jī)是安卓11,所以肯定是一些兼容方面的問題,安卓11的webview沒有后面的安卓版本高。
我又花了兩天通過調(diào)試安卓11的虛擬機(jī)解決了這個兼容問題。
胡大胖對游戲開始了非常嚴(yán)謹(jǐn)?shù)販y試,一直到最后我點(diǎn)下游戲發(fā)行的前一刻,他還在廢寢忘食地測試游戲,一遍一遍地玩已經(jīng)玩過很多遍地劇情,在此再次對胡大胖表示感謝謝謝謝謝謝謝謝謝謝謝謝謝謝謝!
在游戲的測試中,不斷發(fā)現(xiàn)有新的bug,但是改bug并不讓我感到痛苦,所以整個過程都很順利。
十一、Steamworks注冊
在測試游戲的過程中,我想起要去注冊Steamworks去發(fā)行游戲了(其實(shí)這一步應(yīng)該更早的進(jìn)行),趕忙注冊了一個Steamworks賬號。
注冊賬號的過程中,支付了100$用于購買發(fā)行坑位,按照Steam的說法,當(dāng)游戲銷售額達(dá)到1000$時,這100$會還給我。
然后是填寫美國的稅務(wù)表,就按身份證上的信息填寫就可以了。
填寫完,很快steamworks會提示需要上傳補(bǔ)充信息,其實(shí)就是身份證的正反面和手持身份證的正面照,照做就可以了,我一開始沒有仔細(xì)看英文的提示,沒有上傳手持身份證的正面照,稅務(wù)表被打回來了一次,最后提供了手持身份證正面照就成功了。
這個稅務(wù)表的審核如果順利的話2-3個工作日即可完成。
注冊好steamworks后我做的第一件事,就是給游戲定價。
因為我也沒有打算能夠回本,當(dāng)然也不奢望銷量會爆,所以我想要不就把價格設(shè)置得低一點(diǎn)吧,回本是不可能回本了,那就國區(qū)賣9。9人民幣,美區(qū)賣1。99$。
其實(shí)我還可以定得更低一些,但又覺得那未免也太不尊重自己了,就算了。
十二、Steam商品頁準(zhǔn)備
接著我開始準(zhǔn)備Steam的商品頁,按照Steamworks里的表單一項項填寫就可以了,雖然這個商店管理后臺詭異且充滿了屎山的味道,但還是勉強(qiáng)可以使用。
唯一要注意的是上傳商店圖片素材時它是根據(jù)圖片尺寸來自動填充到對應(yīng)的表單位置的,所以圖片的尺寸一定要符合它的要求。
我電腦上沒有ps,我是直接到Photopea網(wǎng)站上調(diào)整的素材大小。
然后我用剪映制作了一個極其粗糙的宣傳片,因為我覺得商店頁面有個游玩視頻感官上會更好一些。
這里因為我游戲提供了繁體/英語/日語,游戲商店我也進(jìn)行了繁體/英語/日語的本地化設(shè)置,主要是游戲描述的文本。
全部設(shè)置好后提交商店審核,然后因為一些小細(xì)節(jié),審核被打回來了一次,修改后,重新提交審核就通過了。
審核通過后,商店就可以在Steam里搜索并被玩家看到了,這個時候Steam會贈送一些曝光,游戲愿望單每天都有增加。
這里前后花了一個星期的時間,這里我犯了一個錯誤,商店審核后沒有立刻點(diǎn)擊商店發(fā)布,導(dǎo)致游戲發(fā)行時間延后了,因為游戲正式發(fā)行時間必須在商店頁面發(fā)布兩周以后。
接著是游戲主體的審核,這里其實(shí)并不需要提供游戲的最終版本,而是只需要一個接近最終版本的游戲版本的就行了,所以即便有bug,也可以提交上去供Steam審核。
第一次審核時Steam又找了一個商店頁面的問題打回來了,并且說最好是支持一下steam overlay,就是進(jìn)入游戲后按shift+tab出來的那個東西。
我想這應(yīng)該不難吧,把商店的問題改好后,就找了steamworks。js庫去適配steam的api,結(jié)果出來的效果不行,一按shift+tab界面就卡死了。
后來在網(wǎng)上一篇文章里找到了原因,是因為electron渲染的網(wǎng)頁是不會實(shí)時刷新的,這和普通的游戲不一樣,按下shift+tab后steam overlay雖然有出來,但是就消不掉了,我在那篇文章里也找到了對應(yīng)的workaround:
“`
function initSteamOverLay() {
function fakeGameloopForSteam() {
const canvas = document.getElementById(
“fake-refresh-steam”
)
const styler = canvas
styler.style.width = `100vw`
styler.style.height = `100vh`
const ctx = canvas.getContext(“2d”)
ctx.clearRect(0, 0, 1, 1)
// Not sure if this could work if fully transparent or if setting CSS opacity to 0, I haven’t tried yet
ctx.fillStyle = “rgba(0, 0, 0, 0)”
ctx.fillRect(0, 0, 1, 1)
requestAnimationFrame(fakeGameloopForSteam)
}
const canvas = document.createElement(“canvas”)
canvas.id = “fake-refresh-steam”
canvas.width = 1
canvas.height = 1
const styler = canvas
styler.style.position = “fixed”
styler.style.top = “0px”
styler.style.bottom = “0px”
styler.style.pointerEvents = “none”
styler.style.zIndex = “30000”
document.body.appendChild(canvas)
fakeGameloopForSteam();
}
“`
然后我又提交了一次steam游戲?qū)徍?,這次審核通過了。
在這個過程中,我得到的教訓(xùn)是,其實(shí)可以更早一些注冊steamworks并發(fā)布商店頁面,因為商店和游戲?qū)徍酥辽僖玫?周,而商店發(fā)布后又需要等2周才能點(diǎn)發(fā)行,所以提前2個月甚至3個月去做發(fā)行相關(guān)的事情是比較合理的,這樣就不會出現(xiàn)游戲做完了卻無法點(diǎn)擊發(fā)行的尷尬場景。
十三、這樣就可以了嗎
游戲做到這一步,我感覺已經(jīng)差不多了,但是在等待steam審核的時候,我又寫下了這樣一段話:
“`
從一個玩家的視角,如何去判斷一個游戲是否好玩?
我覺得最重要的是有沒有在游戲中體會到樂趣。
游戲玩家其實(shí)是一個特別容易討好的人群,他會因為游戲中一些精巧的設(shè)計捧腹大笑,也會在看到一些新奇的很小的東西時感到開心。
并且游戲玩家富有同理心,他們對游戲的代入感特別強(qiáng),你在游戲里討好他,他心里清清楚楚并且很享受。
作為設(shè)計者,我們的游戲是對真實(shí)世界的拙劣的模仿和放大,在其中設(shè)定一些真實(shí)世界不常見甚至是完全不可能的事情。
我們在設(shè)計游戲的時候,需要迎合受眾的尋求,增加相應(yīng)的機(jī)制去滿足玩家的心理需求,這些機(jī)制可以是以下幾種形式:
1. 獨(dú)一無二的特殊事件,通常以游戲主線或分支劇情的形式展開
2. 基于隨機(jī)性過程和結(jié)果重復(fù)的循環(huán)事件,就像是釣魚一樣,你永遠(yuǎn)不知道今天自己會釣上來什么
3. 與真實(shí)世界形成反差的任何游戲設(shè)定,現(xiàn)實(shí)中越難得到的,在游戲中越容易得到,所以連歡樂豆都會有人喜歡攢
4. 與真實(shí)世界可以形成對照和代入的罕見事件,游玩過程中玩家并不具體期待某一件事情,但是永遠(yuǎn)在期待好的事情
5. 玩家需要輕微的挫折,人性都是如此,太容易得到的就不會珍惜,因此玩家在某個方面違反了設(shè)計者設(shè)定的機(jī)制時,便會在游戲中受到數(shù)值或其它方面上的懲罰
“`
我又根據(jù)這些思考,對游戲的部分劇情進(jìn)行了補(bǔ)全,尤其是戀愛事件,因為我發(fā)現(xiàn)胡大胖特別癡迷于和美女們搞好關(guān)系。
這樣,等待發(fā)行的這段時間就也充分利用起來了。
十四、最后的測試與直播
隨著可發(fā)行日期越來越近,在胡大胖還在瘋狂測試的同時,我決定錄制一個游戲的游玩視頻,到時候進(jìn)行steam循環(huán)直播,因為我看了steamwork的文檔,steam是允許錄播的,前提是你在頁面里有表明是錄播(Replay)。
在第一次錄制這個游玩視頻的時候,中后期我自己又發(fā)現(xiàn)了一個不可原諒的bug,就是游戲中就職的公司可能會在發(fā)薪日不發(fā)工資給玩家!
所以只好又匆忙修復(fù)這個bug,然后我發(fā)現(xiàn),修復(fù)的這個bug解決了一些游戲中潛在的一些隱性問題。
這是一件很值得開心的事,現(xiàn)在就發(fā)現(xiàn)bug,比玩家玩的時候發(fā)現(xiàn)bug要好,作為一款低成本的劇情向獨(dú)立游戲,我知道玩家并不會給我第二次機(jī)會,如果因為bug導(dǎo)致主線劇情無法正常游玩,玩家雖然不至于退款,但也不會再有興趣打開游戲了。
然后我第二次開始錄制游戲的游玩視頻,這次非常順利,錄制完后我把游戲?qū)崣C(jī)視頻用OBS軟件推流到steam直播,并且循環(huán)播放,很快我的steam商店頁面就能看到我在直播了。
十五、Steam發(fā)行上線
2025年1月1日零點(diǎn),我終于點(diǎn)下了游戲的發(fā)行按鈕,一切都畫上了句號,也許不圓滿,但我實(shí)現(xiàn)了一個夢想,付出了很多,但是在最后這一刻,我深深地感到了自豪。
游戲首發(fā)第一天就收獲了一條好評,果然愛玩游戲的都是好人!
十六、最后的最后
原本發(fā)行后,如果沒有bug需要修復(fù),做一個獨(dú)立游戲這件事就應(yīng)該畫上句號了,但我覺得應(yīng)該把自己這些經(jīng)歷寫出來,給后來者一個參考,也是給自己一個反思的機(jī)會。
于是見縫插針寫了本文,其中肯定有疏漏或錯誤的地方,歡迎各位大俠指正。
最后,祝大家都能做自己喜歡做的事!
作者:hhacker
原文地址:https://hhacker.com/
本文由 @hhacker 授權(quán)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)作者許可,禁止轉(zhuǎn)載
題圖來自Unsplash,基于CC0協(xié)議
該文觀點(diǎn)僅代表作者本人,人人都是產(chǎn)品經(jīng)理平臺僅提供信息存儲空間服務(wù)
牛逼