I posted the original article on PANEWS.
传统游戏引擎#
游戏引擎是一種用於開發和創建電子遊戲的軟體框架。它包括了遊戲開發所需的許多核心功能,對於傳統的 Web2 遊戲來說,一般包含如渲染引擎、音頻處理、物理模擬和動畫系統等。通過使用遊戲引擎,開發者能夠專注於遊戲設計和創意,而無需從頭開始構建整個技術基礎設施。遊戲引擎為遊戲開發者提供了一個快速有效的工具,以降低開發成本和時間。
有許多知名的 Web2 遊戲引擎,如 Unity、Unreal Engine 和 Godot 等。這些引擎不僅適用於專業開發者,也適用於獨立開發者和初學者。遊戲引擎具有高度可定制性,可以根據項目需求進行調整。它們通常支持跨平台開發,允許開發者為多種設備(如個人計算機、遊戲機和移動設備等)創建遊戲。此外,許多引擎還提供了對虛擬現實(VR)和增強現實(AR)的支持,以滿足不斷發展的技術需求。遊戲引擎還包含了一套豐富的工具集,可以幫助開發者輕鬆地創建遊戲世界、角色和物品。這些工具有助於實現高效的遊戲開發流程,例如可視化的場景編輯器、腳本編輯器以及動畫和特效工具等。
全鏈遊戲引擎#
遊戲引擎在遊戲開發中發揮著至關重要的作用。對於全鏈上遊戲來說,同樣需要一個能夠幫助開發者快速部署遊戲邏輯的工具。這不僅能夠縮短開發周期,還為後續的迭代開發和開放生態中的互操作提供了統一的數據標準。
在這個領域中,較為成熟的項目是由 Lattice 工作室開發的基於 Solidity 的全鏈遊戲引擎 MUD。它使開發者能夠迅速將遊戲邏輯部署到智能合約中,並實現合約與客戶端狀態的同步等功能,從而顯著提高開發效率。
值得注意的是,目前全鏈上遊戲除了採用 Solidity 編寫外,StarkNet 的 Cairo 也是一種常用的語言。然而,MUD 並不能很好地兼容 Cairo。因此,StarkNet 生態中的兩個活躍項目 Realms 和 Briq 的創始人共同開發了基於 Cairo 的全鏈上引擎 Dojo。由於 Dojo 的核心理念與 MUD 相似,引發了 MUD 創始人 Ludens 的不滿。但在一番爭議之後,Ludens 最終表示願意協助將 MUD 部署到 StarkNet 上。
ECS 架構#
開發遊戲引擎時遇到的最大問題是如何表示遊戲對象,遊戲對象可以從沒有控制或交互的簡單 2D 圖像到具有控制、聲音、動畫和 AI 的異常複雜 3D 對象。在概念上,很容易將遊戲對象理解為表示遊戲中具有多個功能的實體。最開始使用面向對象變成 OOP 的架構,現在更為流行的是 ECS 架構(Entity Component System)。
ECS 通過將邏輯、數據和實體分離,提高了遊戲開發的靈活性和可維護性。這種架構模式有助於降低代碼複雜度,減少耦合,從而提升性能和開發效率。ECS 由以下三個主要部分組成:
- 實體(Entity):實體是遊戲世界中的基本對象,如角色、道具或場景物體等。實體本身並不包含任何數據或邏輯,而只是一個唯一標識符,用於關聯組件和系統。
- 組件(Component):組件用於存儲實體的屬性和數據。每個組件負責表示一個特定的特徵或功能,例如位置、速度或生命值等。組件只包含數據,不包含任何邏輯。通過將不同的組件組合在一起,可以輕鬆地創建具有各種功能和特性的實體。
- 系統(System):系統負責處理遊戲邏輯和行為。系統根據實體所擁有的組件來執行相應的操作。例如,一個處理移動的系統會查找具有位置和速度組件的實體,並根據其速度更新位置。系統獨立於實體和組件,使得遊戲邏輯更加模塊化和可重用。
ECS 模式有助於解決傳統面向對象編程(OOP)在遊戲開發中的一些問題,如繼承層次過深和代碼重用困難等。ECS 使得遊戲對象的構建更加靈活,可以通過組合不同的組件輕鬆創建出複雜的行為。此外,ECS 還有助於優化性能,特別是在處理大量遊戲對象時。許多現代遊戲引擎,如 Unity 和 Godot,已經採用了 ECS 作為其核心架構。
全鏈遊戲和 Web2 遊戲甚至常見的 GameFi 遊戲(遊戲資產上鏈但遊戲本身不上鏈)有很大不同,比如,編程語言多採用 Solidity,遊戲對象的屬性狀態儲存在智能合約中,這就導致面向對象編程完全無法使用,只能採用 ECS 架構。
我們來看 Solidity,其實已經在不知不覺中使用過這種模式的變體。以 ERC-20 合約為例:ERC-20 合約將每個地址的代幣余額存儲在一個映射中(從 address 到 uint256 余額)。我們可以將每個 ERC-20 合約視為一個具有兩列的表:"地址" 和 "余額"。這對應於具有單個模式值("余額")的組件。表中的每行都將一個實體("地址")與一個組件值("余額")關聯起來。一個地址可以在許多獨立的 ERC-20 合約中持有余額,這對應於一個實體與許多獨立的組件值關聯。在當前的 ERC-20 參考實現中,狀態和邏輯是耦合在同一個合約中的。在 ECS 中,我們將有一個通用的 "轉賬系統" 來處理從一個地址向另一個地址轉賬代幣的邏輯,通過修改代幣組件中存儲的狀態。
另一個例子是一個簡單的視頻遊戲,可用的組件有 "位置" 和 "生命值"。具有位置的實體在位置組件中有一個條目,具有生命值的實體在生命值組件中有一個條目。"移動系統" 可以實現將實體從一個位置移動到另一個位置的規則。"戰鬥系統" 可以根據涉及實體位置的規則實現戰鬥邏輯,並修改實體的生命值。
MUD 遊戲引擎#
MUD 是一個以太坊應用程序框架。其核心是一組合約接口和使用它們的約定。這些核心接口和庫使得一系列周邊工具、集成和庫能夠更加順暢地進行,從而使鏈上應用程序的開發變得更加簡潔。
MUD 可以實現如下功能
目前
- 在合約和客戶端之間進行狀態同步,無需定制網絡代碼
- 通用索引器(無需定制索引代碼)
- 無縫合約升級(+ 開發過程中的自動合約升級)
- 合約共享狀態
- Optimistic 更新
- 合約和系統的自動生成類型
- 與合約狀態進行交互的查詢語言
- 用於檢查和修改合約和本地狀態的數據瀏覽器
- 位打包實用工具
未來
- 本地模擬事務(包括 Optimistic 狀態)
- 內置支持賬戶抽象化
- 合約包管理器
MUD 的框架包含 8 個庫文件。
- SOLECS 是 MUD 的核心 Solidity 庫,包含了鏈上組件、系統等的接口和參考實現。由於所有狀態都存儲在組件中,並且所有狀態更新都在中心 World 合約中註冊,MUD 可以提供開箱即用的網絡邏輯,以實現合約和客戶端狀態的同步。
- RECS 是用 TypeScript 實現的一種響應式 ECS 庫。它可以獨立於任何鏈上組件使用,但也可以與 SOLECS 共同使用,以便在客戶端上以相同格式鏡像鏈上狀態。
- Services 包含了使用上述方法同步鏈上狀態的通用索引器。
- Network 是智能合約和節點做狀態同步的庫。
基於 StarkNet 的 Dojo 在功能上和 MUD 非常類似,甚至可以認為是用 Cairo 語言把 MUD 重新寫了一遍,所以不再具體講解。在 MUD 的開發者文檔中給出了一個具體的例子來教會大家如何在一天時間就能開發出一個全鏈遊戲:Emojimon(表情怪獸)。感興趣的朋友可以參考這篇官方教程:https://mud.dev/tutorials/emojimon/
基於 MUD 開發的遊戲#
Sky Strife
Sky Strife 是一個基於 MUD 構建的鏈上遊戲。遊戲以快節奏的實時戰略(RTS)戰鬥為特點,展開一場爭奪誰能帶著 “Ember Crown” 逃離戰場的激戰。
Kamigotchi
Kamigotchi 是一款具有 PvP 機制的多人在線角色扮演閒置遊戲。您可以使用您的 Kamigotchi(簡稱 “Kami”)從世界各地散布的節點中收穫 $KAMI。$KAMI 可用於升級您的 Kami 並購買食物。然而,收穫會消耗您的 Kami 的生命值,當生命值較低時,其他玩家可以使用他們的 Kami 獵殺您的 Kami。您需要保持您的 Kami 充飢並仔細觀察它們以獲得最大產出。死亡並不是永久的,核心 NFT 不受影響,但這會讓您付出代價 —— 被殺死的 Kami 在遊戲中無法再次使用,除非使用商店中的某些消耗品復活,當然這需要 $KAMI。此外,您的 Kami 會因為這次經歷而心情受挫。
Muddy Forest
Muddy Forest 是一款完全基於鏈上的大型多人在線實時戰略太空征服遊戲,遊戲中的每個動作,從運輸、發送資源到佔領星球等,都發生在區塊鏈上。