熱更新之lua框架設計

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

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

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

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

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


1.png

    以上架構圖從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 

2.jpg



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章