国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于XLua的Unity腳本框架的設(shè)計(jì)與實(shí)現(xiàn)

2019-05-22 09:27:16李和明
無線互聯(lián)科技 2019年5期
關(guān)鍵詞:腳本

李和明

摘 要:Unity技術(shù)的迅速崛起,讓3D移動(dòng)游戲逐漸流行。隨著游戲系統(tǒng)的不斷豐富,游戲開發(fā)迭代速度迅速加快。但Unity的原生C#開發(fā)效率較慢,而且在部分平臺(tái)上無法進(jìn)行熱更新,無法滿足游戲開發(fā)商的需求。文章旨在將Unity與騰訊開源項(xiàng)目XLua結(jié)合,設(shè)計(jì)并實(shí)現(xiàn)Unity腳本框架,讓游戲開發(fā)商專注于游戲設(shè)計(jì)與邏輯開發(fā),加快游戲開發(fā)效率,減少開發(fā)成本。

關(guān)鍵詞:游戲開發(fā);Unity;XLua;腳本

全球手機(jī)用戶數(shù)量已經(jīng)超過50億[1]。隨著通信信息技術(shù)的快速發(fā)展與智能手機(jī)的普及,以及手游在渲染和表現(xiàn)力上的優(yōu)化,越來越多的智能手機(jī)用戶選擇手機(jī)游戲作為新的娛樂方式[2]。由于Unity技術(shù)的迅速崛起,移動(dòng)3D游戲逐漸流行起來,大量的開發(fā)人員與團(tuán)隊(duì)投入到開發(fā)3D游戲的行列。隨著移動(dòng)游戲的玩法越來越豐富,產(chǎn)品的迭代越來越快,如何保持用戶的新鮮感成為游戲開發(fā)的核心。直接使用C#的開發(fā)效率較慢,成本高,且在部分平臺(tái)較難進(jìn)行熱更新的問題逐漸暴露出來。如何提高開發(fā)效率、減少開發(fā)成本并讓游戲更簡(jiǎn)便的熱更新成為游戲開發(fā)商的迫切需求。

Unity的腳本化不僅可以大幅提高開發(fā)效率,減低開發(fā)成本,還能使用熱更新讓用戶可以直接更新游戲而不用重新下載安裝包,可以滿足游戲項(xiàng)目研發(fā)的實(shí)際需求?,F(xiàn)在有許多游戲開發(fā)商都在進(jìn)行游戲腳本化的研究,但由于成本問題只進(jìn)行了部分腳本化,即只有少部分經(jīng)常需要改動(dòng)的功能采用腳本開發(fā),大部分功能依然是使用C#開發(fā)。部分腳本化效率提升有限,且項(xiàng)目中的邏輯代碼分散在C#部分和腳本部分中,不易于管理。本文嘗試結(jié)合騰訊公司的開源項(xiàng)目XLua,設(shè)計(jì)并實(shí)現(xiàn)Unity的腳本框架。

1 Unity開發(fā)技術(shù)

1.1 Unity游戲開發(fā)

Unity也稱作Unity 3D,是近幾年非常流行的一款3D游戲開發(fā)引擎,其特點(diǎn)就是跨平臺(tái)能力強(qiáng),移植便捷[3]。Unity 3D幾乎已經(jīng)成為快速開發(fā)3D游戲的必備工具。Unity開發(fā)分為原生開發(fā)與腳本開發(fā)。

原生開發(fā)是指使用Unity官方提供的C#環(huán)境進(jìn)行開發(fā)。使用C#語(yǔ)言進(jìn)行開發(fā)可以直接調(diào)用官方提供的各種接口,且官方和民間均提供了大量的文檔[4],學(xué)習(xí)門檻較低。

而腳本開發(fā)是指通過Unity插件,可以讓Unity支持使用Lua語(yǔ)言進(jìn)行開發(fā),把一個(gè)C#實(shí)現(xiàn)替換成Lua實(shí)現(xiàn),并通過與C#交互的方式調(diào)用官方接口。官方雖然沒有提供Lua腳本的相關(guān)文檔,但Lua插件均已經(jīng)在腳本運(yùn)行環(huán)境提供了完善的方法去調(diào)用官方接口,且使用方式基本與C#一致,沒有學(xué)習(xí)障礙。

1.2 Lua腳本開發(fā)與C#開發(fā)對(duì)比

1.2.1 熱更新

熱更新可以讓用戶只用下載容量較小的熱更新包即可進(jìn)行游戲內(nèi)容的更新,由于APP Store等一些平臺(tái)不允許Unity游戲熱更新C#程序庫(kù),必須使用Lua等腳本語(yǔ)言開發(fā)來實(shí)現(xiàn)熱更新功能。

1.2.2 代碼權(quán)限管理

完善的代碼權(quán)限管理可以讓業(yè)務(wù)層的開發(fā)者接觸不到核心引擎的代碼權(quán)限,不僅方便進(jìn)行代碼權(quán)限管理,還可以防范核心引擎代碼泄露。

1.2.3 崩潰情況

錯(cuò)誤的C#代碼有可能導(dǎo)致游戲崩潰,而Lua代碼出錯(cuò)一般只影響局部邏輯,可以上報(bào)腳本錯(cuò)誤,方便后續(xù)解決問題。

1.2.4 反破解

反編譯等黑客技術(shù)讓一個(gè)C#開發(fā)的程序幾乎沒有秘密,而使用Lua腳本后,腳本部分的代碼可以使用加密并在運(yùn)行時(shí)動(dòng)態(tài)解密等技術(shù),保證在進(jìn)程空間內(nèi)幾乎沒有完全代碼存在。

1.2.5 開發(fā)效率

C#開發(fā)過程中,項(xiàng)目中的任何改動(dòng)均需要進(jìn)行重新編譯,隨著項(xiàng)目體量的增大,會(huì)浪費(fèi)大量時(shí)間在編譯上。使用Lua開發(fā),任何改動(dòng)均可直接運(yùn)行項(xiàng)目看結(jié)果,不需編譯,大幅提高開發(fā)效率。

綜上所述,使用Lua進(jìn)行開發(fā)可以大幅提高開發(fā)效率與項(xiàng)目的安全性[5]。

2 基于XLua的Unity腳本框架設(shè)計(jì)與實(shí)現(xiàn)

2.1 XLua介紹

XLua是由騰訊公司維護(hù)的一個(gè)開源項(xiàng)目,使用XLua不僅可以實(shí)現(xiàn)Unity腳本化,更可以在C#層出現(xiàn)BUG后通過熱補(bǔ)丁的方式將C#實(shí)現(xiàn)替換為L(zhǎng)ua實(shí)現(xiàn)從而達(dá)到僅熱更新Lua腳本即可修復(fù)C#層BUG的目的。

2.2 Unity腳本框架的設(shè)計(jì)與實(shí)現(xiàn)

Unity腳本框架由主要由4個(gè)部分組成:腳本運(yùn)行環(huán)境(由XLua提供)、腳本管理器、腳本組件、腳本對(duì)象。

為了提高運(yùn)行效率,腳本管理器采用單例模式,即游戲程序的生命周期內(nèi),只有一個(gè)腳本管理的實(shí)例。

腳本管理器主要負(fù)責(zé)創(chuàng)建腳本運(yùn)行環(huán)境,管理C#環(huán)境與腳本環(huán)境交互的接口。為了讓C#環(huán)境與腳本環(huán)境交互,還需要使用到XLua提供的CSharpCallLua標(biāo)簽。使用該標(biāo)簽的對(duì)象可以將腳本環(huán)境中的對(duì)象映射到C#環(huán)境中。

利用標(biāo)簽CSharpCallLua的特性,將Unity中需要使用的方法封裝在一個(gè)使用CSharpCallLua標(biāo)簽的接口ILua中,并在腳本管理器中實(shí)現(xiàn)這個(gè)接口,讓Unity基礎(chǔ)組件的內(nèi)置方法通過ILua與腳本環(huán)境進(jìn)行交互。

除了實(shí)現(xiàn)接口ILua外,還需要設(shè)計(jì)一個(gè)腳本組件去處理C#環(huán)境與腳本環(huán)境的交互。其核心功能是將Unity內(nèi)置的回調(diào)方法通過ILua與腳本環(huán)境交互。

為了提高運(yùn)行效率,C#環(huán)境中并不保存腳本環(huán)境的實(shí)例,而是通過腳本組件的名字、通過ILua去獲取對(duì)應(yīng)腳本環(huán)境中的實(shí)例,并通過ILua進(jìn)行交互。

同時(shí),還需要在腳本環(huán)境中設(shè)計(jì)一個(gè)與腳本組件對(duì)應(yīng)的映射對(duì)象LuaObject,并通過腳本對(duì)象管理器進(jìn)行管理。在創(chuàng)建Unity的GameObject時(shí),腳本對(duì)象管理器會(huì)自動(dòng)創(chuàng)建一個(gè)對(duì)應(yīng)的LuaObject映射到腳本組件上,LuaObject會(huì)通過ILua與C#環(huán)境交互。LuaObject在腳本組件被銷毀時(shí)自動(dòng)銷毀并從管理器中移除。

3 腳本框架性能測(cè)試評(píng)估

我們通過一系列的試驗(yàn)對(duì)Unity原生C#開發(fā)與各種Lua腳本插件實(shí)現(xiàn)的腳本框架進(jìn)行測(cè)試評(píng)估。我們測(cè)試的內(nèi)容如下:屬性讀寫、成員方法調(diào)用、靜態(tài)方法調(diào)用并返回、純屬性設(shè)置、構(gòu)造valuetype返回。

3.1 時(shí)間消耗測(cè)試

首先,測(cè)試時(shí)間消耗。為此我們通過相同的測(cè)試用例分別運(yùn)行Unity mono(Unity C#),XLua,ulua,cstolua。得到結(jié)果如表1所示。

從測(cè)試結(jié)果可以看出,所有腳本框架的時(shí)間效率都不如直接使用C#開發(fā)。但對(duì)比3種腳本框架,XLua插件的時(shí)間效率最好,與C#開發(fā)的差距較小。相差較大的是屬性讀取與寫入和構(gòu)造valuetype返回值。但這兩項(xiàng)均可以通過優(yōu)化代碼邏輯去避免使用。

3.2 空間消耗測(cè)試

接下來我們進(jìn)行了空間消耗的測(cè)試。由于所有插件實(shí)際操作的均為Unity的對(duì)象,因此這里只對(duì)比不同插件所需的額外空間消耗。測(cè)試結(jié)果如表2所示。

從測(cè)試結(jié)果可知,XLua是3種腳本插件中空間消耗最小的。對(duì)比各項(xiàng)測(cè)試,空間消耗最大的是屬性讀取與寫入以及構(gòu)造valuetype返回。因此,使用腳本框架時(shí)需要謹(jǐn)慎使用屬性讀寫與構(gòu)造valuetype返回。

經(jīng)過上述測(cè)試,我們可以發(fā)現(xiàn),使用XLua實(shí)現(xiàn)Unity腳本框架無論是空間消耗還是時(shí)間消耗,均可以滿足項(xiàng)目實(shí)際使用的要求。

4 結(jié)語(yǔ)

本文基于XLua設(shè)計(jì)并實(shí)現(xiàn)了Unity的腳本框架,犧牲少許運(yùn)行效率,大幅提高開發(fā)效率與項(xiàng)目安全,讓游戲開發(fā)商無需花費(fèi)大量成本去進(jìn)行引擎的腳本化,專注于游戲設(shè)計(jì)與邏輯編寫,加快開發(fā)速度,減少開發(fā)成本,具有實(shí)際參考價(jià)值。

[參考文獻(xiàn)]

[1]趙靚,張彥.淺析手機(jī)媒體娛樂化趨勢(shì)產(chǎn)生的原因[J].消費(fèi)導(dǎo)刊,2010(4):205.

[2]大鵬.基于Unity引擎的手機(jī)游戲客戶端的研究與實(shí)現(xiàn)[D].西安:西安電子科技大學(xué),2014.

[3]趙靚,張彥.基于Unity3D的飛行小鳥游戲的設(shè)計(jì)與實(shí)現(xiàn)[J].電腦知識(shí)與技術(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.

猜你喜歡
腳本
人生腳本
酒駕
此去人海茫茫,各自風(fēng)雨?duì)N爛
安奇奇與小cool 龍(第二回)
數(shù)據(jù)庫(kù)系統(tǒng)shell腳本應(yīng)用
自動(dòng)推送與網(wǎng)站匹配的腳本
電腦愛好者(2018年6期)2018-04-23 16:53:16
快樂假期
神奇的數(shù)學(xué)
愚人節(jié)大作戰(zhàn)
小編的新年愿望
中學(xué)生(2017年1期)2017-03-24 09:54:28
红安县| 十堰市| 沿河| 乐东| 尉氏县| 印江| 福安市| 廊坊市| 安远县| 曲靖市| 本溪市| 上犹县| 松溪县| 鲁山县| 绥宁县| 绥江县| 林周县| 雷州市| 年辖:市辖区| 枞阳县| 克什克腾旗| 三门峡市| 柳江县| 涟源市| 梨树县| 青海省| 新巴尔虎右旗| 北安市| 鸡西市| 卓尼县| 通许县| 巨鹿县| 封开县| 澄城县| 浑源县| 唐河县| 柯坪县| 永春县| 中山市| 诏安县| 唐海县|