Roblox 開發

發布日期

為什麼用 Roblox?

有些人問我為什麼要用 Roblox 做遊戲?市面上有許多已經成熟的引擎,像是 Unity、Unreal Engine,它們都有健全的系統,像是內建的狀態機、ECS 架構。相對的,Roblox 採 OOP 的方向,沒有其他支援,剩下的功能都需要自己實作。在方便性的考量上,Roblox 提供免費的伺服器與抽象層,所有的 伺服器成本不需要任何資本,單純就此而言就足夠選擇 Roblox。雖然 Roblox 的伺服器的算力不算高,優化是開發者的責任,因此我們需要懂如何在現 有的資源中提高效能。

你如何開發遊戲?

在 Roblox 中,最常使用的是 Luau(有靜態除錯功能的 Lua 方言),不過,Luau 雖然有這樣的功能,實際上在 IDE 中效率不夠高,因此,我們使用第三方 的開源軟體 Roblox-TS,它提供前置變換系統和轉譯。使用 Typescript 的好處在於強型別保護機制,因此顯見的程式漏洞較少。在系統方面,我採用 混成式架構,將 ECS、OOP、FP 結合在一起,ECS 系統使用的是 Matter 程式庫,它提供內建的除錯裝置(Plasma 後台),使用上淺顯易懂。不過,製作 使用者介面時,ECS 系統是較難與其合作,因此,我們使用了物件導向,以單例作為中介站,使以 Fusion(函數導向 UI 架構)實作的 UI 與 ECS 之間有 抽象化隱晦資料傳輸。

如何寫 Netcode?

Roblox 給開發者的資料傳輸方式非常簡易,Remote Event:Serialize -> Send 不需回傳,Remote Function:Serialize -> Send -> Callback 則需要,在 Typescript 中,直接使用這些物件是非常危險的,因為所有的相關傳輸資料的型別都在傳輸中喪失,因此,我們使用 RbxNet,一個「單 物件單傳輸方式」網路系統。在複製對效率非常注重的物體時,如動畫,只要差一個幀便非常擾人、影響體驗,因此,我們使用乾視體(Dry View Model)傳輸方式,在客戶端再補水成為濕物件(Wet Model),這個傳輸方式的優點是——伺服器不需要運算所有的附帶效果,像是動畫自帶的 衍生實體,大大減少伺服器的負擔。

對於超大地圖而言,Roblox 吃虧嗎?

當地圖越做越大時,客戶端所受到的負擔也越來越大,對於手機與低階電腦等客戶而言是非常不利的,因此,我們使用 Roblox 內建的串流系統,可以 只在客戶有需求時再將部分實體傳至客戶(Loading on Demand),也因為這樣,我們的程式需要是純的(Pure),由定義,對於無關FF的函數後的 遊戲模型UU而言,在只有使用系統FF後,Uf=UiU_f = U_i必定成立。同時,為了維護系統的穩健性(Robustness),我們也是使用乾濕設計理念處理 相關的串流問題。當在突發狀況(例如串流中斷)下,遇到歧義時,客戶端需要順從伺服器的決定。

所以,Roblox 好用嗎?

好用!不過,由於自由度很大,你也要因此提高警覺,不要將設計搞砸了。

後記

這個貼文並不是上一個貼文的中文翻譯,請勿混淆。如有任何問題請在 Discord 上聯絡@algasami。