李和明
摘 要:Unity技術的迅速崛起,讓3D移動游戲逐漸流行。隨著游戲系統的不斷豐富,游戲開發迭代速度迅速加快。但Unity的原生C#開發效率較慢,而且在部分平臺上無法進行熱更新,無法滿足游戲開發商的需求。文章旨在將Unity與騰訊開源項目XLua結合,設計并實現Unity腳本框架,讓游戲開發商專注于游戲設計與邏輯開發,加快游戲開發效率,減少開發成本。
關鍵詞:游戲開發;Unity;XLua;腳本
全球手機用戶數量已經超過50億[1]。隨著通信信息技術的快速發展與智能手機的普及,以及手游在渲染和表現力上的優化,越來越多的智能手機用戶選擇手機游戲作為新的娛樂方式[2]。由于Unity技術的迅速崛起,移動3D游戲逐漸流行起來,大量的開發人員與團隊投入到開發3D游戲的行列。隨著移動游戲的玩法越來越豐富,產品的迭代越來越快,如何保持用戶的新鮮感成為游戲開發的核心。直接使用C#的開發效率較慢,成本高,且在部分平臺較難進行熱更新的問題逐漸暴露出來。如何提高開發效率、減少開發成本并讓游戲更簡便的熱更新成為游戲開發商的迫切需求。
Unity的腳本化不僅可以大幅提高開發效率,減低開發成本,還能使用熱更新讓用戶可以直接更新游戲而不用重新下載安裝包,可以滿足游戲項目研發的實際需求。現在有許多游戲開發商都在進行游戲腳本化的研究,但由于成本問題只進行了部分腳本化,即只有少部分經常需要改動的功能采用腳本開發,大部分功能依然是使用C#開發。部分腳本化效率提升有限,且項目中的邏輯代碼分散在C#部分和腳本部分中,不易于管理。本文嘗試結合騰訊公司的開源項目XLua,設計并實現Unity的腳本框架。
1 Unity開發技術
1.1 Unity游戲開發
Unity也稱作Unity 3D,是近幾年非常流行的一款3D游戲開發引擎,其特點就是跨平臺能力強,移植便捷[3]。Unity 3D幾乎已經成為快速開發3D游戲的必備工具。Unity開發分為原生開發與腳本開發。
原生開發是指使用Unity官方提供的C#環境進行開發。使用C#語言進行開發可以直接調用官方提供的各種接口,且官方和民間均提供了大量的文檔[4],學習門檻較低。
而腳本開發是指通過Unity插件,可以讓Unity支持使用Lua語言進行開發,把一個C#實現替換成Lua實現,并通過與C#交互的方式調用官方接口。官方雖然沒有提供Lua腳本的相關文檔,但Lua插件均已經在腳本運行環境提供了完善的方法去調用官方接口,且使用方式基本與C#一致,沒有學習障礙。
1.2 Lua腳本開發與C#開發對比
1.2.1 熱更新
熱更新可以讓用戶只用下載容量較小的熱更新包即可進行游戲內容的更新,由于APP Store等一些平臺不允許Unity游戲熱更新C#程序庫,必須使用Lua等腳本語言開發來實現熱更新功能。
1.2.2 代碼權限管理
完善的代碼權限管理可以讓業務層的開發者接觸不到核心引擎的代碼權限,不僅方便進行代碼權限管理,還可以防范核心引擎代碼泄露。
1.2.3 崩潰情況
錯誤的C#代碼有可能導致游戲崩潰,而Lua代碼出錯一般只影響局部邏輯,可以上報腳本錯誤,方便后續解決問題。
1.2.4 反破解
反編譯等黑客技術讓一個C#開發的程序幾乎沒有秘密,而使用Lua腳本后,腳本部分的代碼可以使用加密并在運行時動態解密等技術,保證在進程空間內幾乎沒有完全代碼存在。
1.2.5 開發效率
C#開發過程中,項目中的任何改動均需要進行重新編譯,隨著項目體量的增大,會浪費大量時間在編譯上。使用Lua開發,任何改動均可直接運行項目看結果,不需編譯,大幅提高開發效率。
綜上所述,使用Lua進行開發可以大幅提高開發效率與項目的安全性[5]。
2 基于XLua的Unity腳本框架設計與實現
2.1 XLua介紹
XLua是由騰訊公司維護的一個開源項目,使用XLua不僅可以實現Unity腳本化,更可以在C#層出現BUG后通過熱補丁的方式將C#實現替換為Lua實現從而達到僅熱更新Lua腳本即可修復C#層BUG的目的。
2.2 Unity腳本框架的設計與實現
Unity腳本框架由主要由4個部分組成:腳本運行環境(由XLua提供)、腳本管理器、腳本組件、腳本對象。
為了提高運行效率,腳本管理器采用單例模式,即游戲程序的生命周期內,只有一個腳本管理的實例。
腳本管理器主要負責創建腳本運行環境,管理C#環境與腳本環境交互的接口。為了讓C#環境與腳本環境交互,還需要使用到XLua提供的CSharpCallLua標簽。使用該標簽的對象可以將腳本環境中的對象映射到C#環境中。
利用標簽CSharpCallLua的特性,將Unity中需要使用的方法封裝在一個使用CSharpCallLua標簽的接口ILua中,并在腳本管理器中實現這個接口,讓Unity基礎組件的內置方法通過ILua與腳本環境進行交互。
除了實現接口ILua外,還需要設計一個腳本組件去處理C#環境與腳本環境的交互。其核心功能是將Unity內置的回調方法通過ILua與腳本環境交互。
為了提高運行效率,C#環境中并不保存腳本環境的實例,而是通過腳本組件的名字、通過ILua去獲取對應腳本環境中的實例,并通過ILua進行交互。
同時,還需要在腳本環境中設計一個與腳本組件對應的映射對象LuaObject,并通過腳本對象管理器進行管理。在創建Unity的GameObject時,腳本對象管理器會自動創建一個對應的LuaObject映射到腳本組件上,LuaObject會通過ILua與C#環境交互。LuaObject在腳本組件被銷毀時自動銷毀并從管理器中移除。
3 腳本框架性能測試評估
我們通過一系列的試驗對Unity原生C#開發與各種Lua腳本插件實現的腳本框架進行測試評估。我們測試的內容如下:屬性讀寫、成員方法調用、靜態方法調用并返回、純屬性設置、構造valuetype返回。
3.1 時間消耗測試
首先,測試時間消耗。為此我們通過相同的測試用例分別運行Unity mono(Unity C#),XLua,ulua,cstolua。得到結果如表1所示。
從測試結果可以看出,所有腳本框架的時間效率都不如直接使用C#開發。但對比3種腳本框架,XLua插件的時間效率最好,與C#開發的差距較小。相差較大的是屬性讀取與寫入和構造valuetype返回值。但這兩項均可以通過優化代碼邏輯去避免使用。
3.2 空間消耗測試
接下來我們進行了空間消耗的測試。由于所有插件實際操作的均為Unity的對象,因此這里只對比不同插件所需的額外空間消耗。測試結果如表2所示。
從測試結果可知,XLua是3種腳本插件中空間消耗最小的。對比各項測試,空間消耗最大的是屬性讀取與寫入以及構造valuetype返回。因此,使用腳本框架時需要謹慎使用屬性讀寫與構造valuetype返回。
經過上述測試,我們可以發現,使用XLua實現Unity腳本框架無論是空間消耗還是時間消耗,均可以滿足項目實際使用的要求。
4 結語
本文基于XLua設計并實現了Unity的腳本框架,犧牲少許運行效率,大幅提高開發效率與項目安全,讓游戲開發商無需花費大量成本去進行引擎的腳本化,專注于游戲設計與邏輯編寫,加快開發速度,減少開發成本,具有實際參考價值。
[參考文獻]
[1]趙靚,張彥.淺析手機媒體娛樂化趨勢產生的原因[J].消費導刊,2010(4):205.
[2]大鵬.基于Unity引擎的手機游戲客戶端的研究與實現[D].西安:西安電子科技大學,2014.
[3]趙靚,張彥.基于Unity3D的飛行小鳥游戲的設計與實現[J].電腦知識與技術,2018(30):65-66.
[4]宣雨松.UNITY3D游戲開發[M].北京:人民郵電出版社,2012.
[5]EBERLY D H.3D Game engine architecture: engineering real-time applications with wild magic[J].3D Game Engine Architecture,2004(7):699-701.