熱更新之lua框架設計

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

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

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

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

     首先爲了不直接深刻代碼的海洋,先就筆者設計的框架給出一個總體設計圖,供參考。ide


1.png

    以上架構圖從LuaStartGame這個C#腳本入口開始,而後後續業務基本採用lua語言編寫。LuaStartGame.cs 腳本以下。函數

namespace LuaFramework{學習

    public class LuaGameStart : MonoBehaviour{ui

        void Start()this

        {lua

            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

相關文章
相關標籤/搜索