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