遊戲引擎在遊戲開發中發揮著至關重要的作用。對於全鏈上游戲來說,同樣需要一個能夠幫助開發者快速部署遊戲邏輯的工具。這不僅能夠縮短開發週期,還為後續的迭代開發和開放生態中的互操作提供了統一的數據標準。
傳統遊戲引擎
遊戲引擎是一種用於開發和創建電子遊戲的軟件框架。它包括了遊戲開發所需的許多核心功能,對於傳統的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是一款完全基於鏈上的大型多人在線實時戰略太空征服遊戲,遊戲中的每個動作,從運輸、發送資源到佔領星球等,都發生在區塊鏈上。
文:JustinZhao
原標題:深度解析全鏈遊戲引擎MUD