亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

熱更新之lua框架設計

發布時間:2020-08-11 23:19:56 來源:網絡 閱讀:802 作者:Liu_guozhu 欄目:游戲開發

????? ?目前中大型游戲項目包含部分VR與AR項目,都需要熱更新與在線修改Bug等功能實現,雖然Xlua等插件已經給出了關于C#與Lua語言之間的雙向無縫調用實現,但是就熱更新的架構卻沒有提出,這需要廣大游戲公司的開發人員自己來設計一套lua框架。?

????? 早期熱更新的概念與實現機理剛傳入國內實現的時候,很多公司采用純lua腳本的方式,來構建整個項目。 這種方式開發速度慢,且極易出錯,開發效率不高。所以后來各公司就純lua的熱更新技術,自己來進行架構設計,引入例如MVC的分層理念,然后通過C#與lua之間的映射方式,來讓lua文件獲取unity的生命周期函數,以此來獲得更高的開發效率。

???? 筆者認為最好的方式應該把業務功能相對穩定的功能用C#來開發,而lua框架部分也僅僅處理游戲項目中業務需求隨事件頻繁更新的業務需求,例如游戲中的“每日公告”,“每日任務”等。

? ? ?以上問題比較復雜,筆者本篇文章,就純lua語言來開發一套簡單的lua框架系統,實現以上描述的業務功能實現。

? ? ?首先為了避免直接深入代碼的海洋,先就筆者設計的框架給出一個整體設計圖,供參考。


熱更新之lua框架設計

? ? 以上架構圖從LuaStartGame這個C#腳本入口開始,然后后續業務基本采用lua語言編寫。LuaStartGame.cs 腳本如下。

namespace LuaFramework{

? ? public class LuaGameStart : MonoBehaviour{

? ? ? ? void Start()

? ? ? ? {

? ? ? ? ? ? LuaHelper.GetInstance().DoString("require 'StartGame'");

? ? ? ? }

? ? }//Class_end

}//namespace_end


? ? 以上項目中的LuaHelper封裝了Xlua的環境上下文(LuaEnv)、自定義lua文件的存取路徑(不再使用xlua默認的Resources)以及常用lua方法等。

? ? StartGame.lua 腳本基本沒有太多業務,主要起到承上啟下,便于日后擴充的中間“過渡”腳本使用,代碼如下:


---

---? Lua項目開始入門腳本

---

--引入項目常量與“枚舉”

require("SysDefine")

--引入項目初始化核心腳本

require("ProjectInit")

--項目開始

ProjectInit.Init()


? ? ?以上腳本SysDefine中以“表”(Table)的形式定義了項目中可能用到的所有“控制層”與“顯示層”的lua腳本,以方便在后續lua腳本中使用,這個機制類似于C#中使用一個類來集中定義項目中所有的常量與枚舉等類型。

ProjectInit.lua 是本lua框架的一個核心,負責緩存項目中所有的“視圖層”與“控制層”腳本。本腳本通過加載首個業務窗體(UIRootCtrl.lua)實現后續業務開發的持續運行。這里需要特別說明的是CtrlMgr.lua 腳本是負責緩存項目中所有控制層腳本的實例,以及提供控制層腳本訪問的入口方法。

---

---? “lua框架”項目初始化

---

---? ?功能:

---? ? ? 1: 引入項目中所有的視圖層腳本

---? ? ? 2: 通過CtrlMgr.lua (控制層)腳本,來緩存系統中所有其他控制層腳本。

---? ? ? 3: 提供訪問其他控制層腳本的入口函數。

---? ? ? 4: 調用項目中第一個UI預設控制層腳本。

---

---


--引入控制層管理器腳本

require("CtrlMgr")

ProjectInit={}

local this=ProjectInit


function ProjectInit.Init()

? ? --導入引入項目中所有的視圖層腳本

? ? this.ImportAllViews()

? ? --lua控制器初始化

? ? CtrlMgr.Init()

? ? --加載UI‘根窗體’控制腳本

? ? CtrlMgr.StartProcess(CtrlName.UIRootCtrl)

end


--導入引入項目中所有的視圖層腳本

function ProjectInit.ImportAllViews()

? ? for i = 1, #ViewNames do

? ? ? ? require(tostring(ViewNames[i]))

? ? end

end


? ? ? 再往后的lua代碼都與具體的業務功能實現有關系。基本都按照設計成對出現,例如本演示項目中的 UIRootCtrl.lua 與UIRootView.lua ,表示加載與顯示UI根窗體。*Ctrl.lua定義玩家看不見的業務邏輯,例如加載與解析從服務器端傳來的ab包資源,然后關于UI窗體內部的控件顯示、顯示方位、控件的事件注冊等業務,都有*View.lua負責處理。這樣實現了架構設計中的分層設計原理。

? ? ? 最后值得說明的是,*View.lua 是負責顯示具體3D/2D游戲預設資源的腳本。其內部定義預設顯示的“方式”、“具體內容”與“行為”(包含事件注冊)等。而本部分我們采用了xlua的映射技術,使得“lua顯示”腳本具備了Unity的常用生命周期函數,進一步大大簡化了lua編寫業務的難度,例如定義了常見的:Awake()、Start()、Update()、OnDestroy()等函數。

為了避免編寫超長的技術博客文章,關于其他代碼的具體實現部分,筆者在最后提供lua架構的演示項目下載鏈接,供廣大有興趣學員學習研究,共同進步。


下載鏈接與二維碼:

? ? ?鏈接:https://pan.baidu.com/s/1BobsN0c_4bBr1LSwF2li3Q?

? ? ?提取碼:bquu?

熱更新之lua框架設計



向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

吉林市| 哈巴河县| 阿拉尔市| 安岳县| 皋兰县| 延长县| 萨嘎县| 谢通门县| 赤壁市| 涟源市| 汨罗市| 增城市| 三河市| 郑州市| 精河县| 固镇县| 两当县| 达尔| 丹东市| 罗山县| 贵阳市| 保定市| 阳高县| 泊头市| 淮安市| 宁波市| 宜兴市| 安达市| 阳原县| 航空| 城市| 平凉市| 峡江县| 修武县| 南京市| 通榆县| 固原市| 红安县| 东乌| 嘉善县| 彝良县|