您好,登錄后才能下訂單哦!
????? ?目前中大型游戲項目包含部分VR與AR項目,都需要熱更新與在線修改Bug等功能實現(xiàn),雖然Xlua等插件已經(jīng)給出了關(guān)于C#與Lua語言之間的雙向無縫調(diào)用實現(xiàn),但是就熱更新的架構(gòu)卻沒有提出,這需要廣大游戲公司的開發(fā)人員自己來設(shè)計一套lua框架。?
????? 早期熱更新的概念與實現(xiàn)機理剛傳入國內(nèi)實現(xiàn)的時候,很多公司采用純lua腳本的方式,來構(gòu)建整個項目。 這種方式開發(fā)速度慢,且極易出錯,開發(fā)效率不高。所以后來各公司就純lua的熱更新技術(shù),自己來進(jìn)行架構(gòu)設(shè)計,引入例如MVC的分層理念,然后通過C#與lua之間的映射方式,來讓lua文件獲取unity的生命周期函數(shù),以此來獲得更高的開發(fā)效率。
???? 筆者認(rèn)為最好的方式應(yīng)該把業(yè)務(wù)功能相對穩(wěn)定的功能用C#來開發(fā),而lua框架部分也僅僅處理游戲項目中業(yè)務(wù)需求隨事件頻繁更新的業(yè)務(wù)需求,例如游戲中的“每日公告”,“每日任務(wù)”等。
? ? ?以上問題比較復(fù)雜,筆者本篇文章,就純lua語言來開發(fā)一套簡單的lua框架系統(tǒng),實現(xiàn)以上描述的業(yè)務(wù)功能實現(xiàn)。
? ? ?首先為了避免直接深入代碼的海洋,先就筆者設(shè)計的框架給出一個整體設(shè)計圖,供參考。
? ? 以上架構(gòu)圖從LuaStartGame這個C#腳本入口開始,然后后續(xù)業(yè)務(wù)基本采用lua語言編寫。LuaStartGame.cs 腳本如下。
namespace LuaFramework{
? ? public class LuaGameStart : MonoBehaviour{
? ? ? ? void Start()
? ? ? ? {
? ? ? ? ? ? LuaHelper.GetInstance().DoString("require 'StartGame'");
? ? ? ? }
? ? }//Class_end
}//namespace_end
? ? 以上項目中的LuaHelper封裝了Xlua的環(huán)境上下文(LuaEnv)、自定義lua文件的存取路徑(不再使用xlua默認(rèn)的Resources)以及常用lua方法等。
? ? StartGame.lua 腳本基本沒有太多業(yè)務(wù),主要起到承上啟下,便于日后擴充的中間“過渡”腳本使用,代碼如下:
---
---? Lua項目開始入門腳本
---
--引入項目常量與“枚舉”
require("SysDefine")
--引入項目初始化核心腳本
require("ProjectInit")
--項目開始
ProjectInit.Init()
? ? ?以上腳本SysDefine中以“表”(Table)的形式定義了項目中可能用到的所有“控制層”與“顯示層”的lua腳本,以方便在后續(xù)lua腳本中使用,這個機制類似于C#中使用一個類來集中定義項目中所有的常量與枚舉等類型。
ProjectInit.lua 是本lua框架的一個核心,負(fù)責(zé)緩存項目中所有的“視圖層”與“控制層”腳本。本腳本通過加載首個業(yè)務(wù)窗體(UIRootCtrl.lua)實現(xiàn)后續(xù)業(yè)務(wù)開發(fā)的持續(xù)運行。這里需要特別說明的是CtrlMgr.lua 腳本是負(fù)責(zé)緩存項目中所有控制層腳本的實例,以及提供控制層腳本訪問的入口方法。
---
---? “l(fā)ua框架”項目初始化
---
---? ?功能:
---? ? ? 1: 引入項目中所有的視圖層腳本
---? ? ? 2: 通過CtrlMgr.lua (控制層)腳本,來緩存系統(tǒng)中所有其他控制層腳本。
---? ? ? 3: 提供訪問其他控制層腳本的入口函數(shù)。
---? ? ? 4: 調(diào)用項目中第一個UI預(yù)設(shè)控制層腳本。
---
---
--引入控制層管理器腳本
require("CtrlMgr")
ProjectInit={}
local this=ProjectInit
function ProjectInit.Init()
? ? --導(dǎo)入引入項目中所有的視圖層腳本
? ? this.ImportAllViews()
? ? --lua控制器初始化
? ? CtrlMgr.Init()
? ? --加載UI‘根窗體’控制腳本
? ? CtrlMgr.StartProcess(CtrlName.UIRootCtrl)
end
--導(dǎo)入引入項目中所有的視圖層腳本
function ProjectInit.ImportAllViews()
? ? for i = 1, #ViewNames do
? ? ? ? require(tostring(ViewNames[i]))
? ? end
end
? ? ? 再往后的lua代碼都與具體的業(yè)務(wù)功能實現(xiàn)有關(guān)系?;径及凑赵O(shè)計成對出現(xiàn),例如本演示項目中的 UIRootCtrl.lua 與UIRootView.lua ,表示加載與顯示UI根窗體。*Ctrl.lua定義玩家看不見的業(yè)務(wù)邏輯,例如加載與解析從服務(wù)器端傳來的ab包資源,然后關(guān)于UI窗體內(nèi)部的控件顯示、顯示方位、控件的事件注冊等業(yè)務(wù),都有*View.lua負(fù)責(zé)處理。這樣實現(xiàn)了架構(gòu)設(shè)計中的分層設(shè)計原理。
? ? ? 最后值得說明的是,*View.lua 是負(fù)責(zé)顯示具體3D/2D游戲預(yù)設(shè)資源的腳本。其內(nèi)部定義預(yù)設(shè)顯示的“方式”、“具體內(nèi)容”與“行為”(包含事件注冊)等。而本部分我們采用了xlua的映射技術(shù),使得“l(fā)ua顯示”腳本具備了Unity的常用生命周期函數(shù),進(jìn)一步大大簡化了lua編寫業(yè)務(wù)的難度,例如定義了常見的:Awake()、Start()、Update()、OnDestroy()等函數(shù)。
為了避免編寫超長的技術(shù)博客文章,關(guān)于其他代碼的具體實現(xiàn)部分,筆者在最后提供lua架構(gòu)的演示項目下載鏈接,供廣大有興趣學(xué)員學(xué)習(xí)研究,共同進(jìn)步。
下載鏈接與二維碼:
? ? ?鏈接:https://pan.baidu.com/s/1BobsN0c_4bBr1LSwF2li3Q?
? ? ?提取碼:bquu?
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。