找回密碼
 注冊帳號

掃一掃,訪問微社區

劉國柱 熱更新之lua框架設計

19
回復
2096
查看
打印 上一主題 下一主題
[ 復制鏈接 ]

21

主題

107

帖子

910

積分

Rank: 9Rank: 9Rank: 9

UID
34511
好友
42
蠻牛幣
1391
威望
0
注冊時間
2014-7-15
在線時間
474 小時
最后登錄
2019-8-10

專欄作家

馬上注冊,結交更多好友,享用更多功能,讓你輕松玩轉社區。

您需要 登錄 才可以下載或查看,沒有帳號?注冊帳號

x
本帖最后由 liu_guozhu 于 2019-6-3 19:31 編輯

      目前中大型游戲項目包含部分VR與AR項目,都需要熱更新與在線修改Bug等功能實現,雖然Xlua等插件已經給出了關于C#與Lua語言之間的雙向無縫調用實現,但是就熱更新的架構卻沒有提出,這需要廣大游戲公司的開發人員自己來設計一套lua框架。
      早期熱更新的概念與實現機理剛傳入國內實現的時候,很多公司采用純lua腳本的方式,來構建整個項目。 這種方式開發速度慢,且極易出錯,開發效率不高。所以后來各公司就純lua的熱更新技術,自己來進行架構設計,引入例如MVC的分層理念,然后通過C#與lua之間的映射方式,來讓lua文件獲取unity的生命周期函數,以此來獲得更高的開發效率。
      筆者認為最好的方式應該把業務功能相對穩定的功能用C#來開發,而lua框架部分也僅僅處理游戲項目中業務需求隨事件頻繁更新的業務需求,例如游戲中的“每日公告”,“每日任務”等。
     以上問題比較復雜,筆者本篇文章,就純lua語言來開發一套簡單的lua框架系統,實現以上描述的業務功能實現。
     首先為了避免直接深入代碼的海洋,先就筆者設計的框架給出一個整體設計圖,供參考。


以上架構圖從LuaStartGame這個C#腳本入口開始,然后后續業務基本采用lua語言編寫。LuaStartGame.cs 腳本如下。
[C#] 純文本查看 復制代碼
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 腳本基本沒有太多業務,主要起到承上啟下,便于日后擴充的中間“過渡”腳本使用,代碼如下:
[C#] 純文本查看 復制代碼
[/size][size=3]--引入項目常量與“枚舉”
require("SysDefine")
--引入項目初始化核心腳本
require("ProjectInit")
--項目開始
ProjectInit.Init()

    以上腳本SysDefine中以“表”(Table)的形式定義了項目中可能用到的所有“控制層”與“顯示層”的lua腳本,以方便在后續lua腳本中使用,這個機制類似于C#中使用一個類來集中定義項目中所有的常量與枚舉等類型。
    ProjectInit.lua 是本lua框架的一個核心,負責緩存項目中所有的“視圖層”與“控制層”腳本。本腳本通過加載首個業務窗體(UIRootCtrl.lua)實現后續業務開發的持續運行。這里需要特別說明的是CtrlMgr.lua 腳本是負責緩存項目中所有控制層腳本的實例,以及提供控制層腳本訪問的入口方法。

[AppleScript] 純文本查看 復制代碼
---
---  “lua框架”項目初始化
---
---   功能:
---      1: 引入項目中所有的視圖層腳本
---      2: 通過CtrlMgr.lua (控制層)腳本,來緩存系統中所有其他控制層腳本。
---      3: 提供訪問其他控制層腳本的入口函數。
---      4: 調用項目中第一個UI預設控制層腳本。
---
---[/size][size=3]
--引入控制層管理器腳本
require("CtrlMgr")

ProjectInit={}
local this=ProjectInit
[/size] [size=3]
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



回復

使用道具 舉報

6蠻牛粉絲
1060/1500
排名
10818
昨日變化

3

主題

790

帖子

1060

積分

Rank: 6Rank: 6Rank: 6

UID
310426
好友
0
蠻牛幣
1399
威望
0
注冊時間
2019-1-2
在線時間
171 小時
最后登錄
2019-8-12
沙發
2019-6-4 08:40:39 只看該作者

回帖獎勵 +2

lua框架設計
回復

使用道具 舉報

排名
331
昨日變化

80

主題

683

帖子

4050

積分

Rank: 9Rank: 9Rank: 9

UID
93357
好友
6
蠻牛幣
20279
威望
0
注冊時間
2015-4-18
在線時間
1437 小時
最后登錄
2019-8-12

專欄作家認證開發者

QQ
板凳
2019-6-4 09:23:21 只看該作者
Lua 熱更新,請問用什么編輯器
回復 支持 反對

使用道具 舉報

5熟悉之中
647/1000
排名
16955
昨日變化

1

主題

245

帖子

647

積分

Rank: 5Rank: 5

UID
213085
好友
5
蠻牛幣
492
威望
0
注冊時間
2017-3-20
在線時間
361 小時
最后登錄
2019-8-12
地板
2019-6-4 09:25:47 只看該作者
學習一下 謝謝!!!!!!!!!!!!
回復

使用道具 舉報

6蠻牛粉絲
1015/1500
排名
3927
昨日變化

0

主題

316

帖子

1015

積分

Rank: 6Rank: 6Rank: 6

UID
251353
好友
0
蠻牛幣
7329
威望
0
注冊時間
2017-10-29
在線時間
319 小時
最后登錄
2019-8-9

錦衣玉食

5#
2019-6-4 09:49:35 只看該作者
學習老師的LUA更新
回復 支持 反對

使用道具 舉報

4四處流浪
428/500
排名
9201
昨日變化

0

主題

42

帖子

428

積分

Rank: 4

UID
250135
好友
0
蠻牛幣
430
威望
0
注冊時間
2017-10-22
在線時間
260 小時
最后登錄
2019-8-12
6#
2019-6-4 10:14:35 只看該作者
支持劉老師。
回復

使用道具 舉報

5熟悉之中
791/1000
排名
4110
昨日變化

1

主題

263

帖子

791

積分

Rank: 5Rank: 5

UID
245227
好友
0
蠻牛幣
970
威望
0
注冊時間
2017-9-21
在線時間
167 小時
最后登錄
2019-8-12
7#
2019-6-4 10:34:19 只看該作者
濃濃的MVC風格?
回復

使用道具 舉報

4四處流浪
308/500
排名
9112
昨日變化

0

主題

76

帖子

308

積分

Rank: 4

UID
191027
好友
0
蠻牛幣
662
威望
0
注冊時間
2016-12-10
在線時間
104 小時
最后登錄
2019-7-13
8#
2019-6-4 11:37:52 只看該作者
用什么Unity版本開發的呢?
回復 支持 反對

使用道具 舉報

5熟悉之中
713/1000
排名
10706
昨日變化

0

主題

463

帖子

713

積分

Rank: 5Rank: 5

UID
301976
好友
1
蠻牛幣
1069
威望
0
注冊時間
2018-10-31
在線時間
152 小時
最后登錄
2019-8-12
9#
2019-6-4 14:19:34 只看該作者
MVC確實是很濃。。。
回復

使用道具 舉報

7日久生情
2068/5000
排名
4092
昨日變化

0

主題

1350

帖子

2068

積分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
254705
好友
1
蠻牛幣
1883
威望
0
注冊時間
2017-11-16
在線時間
356 小時
最后登錄
2019-8-12
10#
2019-6-4 15:02:43 只看該作者
666666666666666666666666
回復 支持 反對

使用道具 舉報

4四處流浪
380/500
排名
16594
昨日變化

1

主題

133

帖子

380

積分

Rank: 4

UID
281418
好友
0
蠻牛幣
520
威望
0
注冊時間
2018-5-16
在線時間
204 小時
最后登錄
2019-8-12
11#
2019-6-4 16:15:30 只看該作者
lua框架設計   
回復 支持 反對

使用道具 舉報

21

主題

107

帖子

910

積分

Rank: 9Rank: 9Rank: 9

UID
34511
好友
42
蠻牛幣
1391
威望
0
注冊時間
2014-7-15
在線時間
474 小時
最后登錄
2019-8-10

專欄作家

12#
樓主 2019-6-4 20:26:16 只看該作者
gxguixin123 發表于 2019-6-4 09:23
Lua 熱更新,請問用什么編輯器

我推薦用IDEA 配合lua插件,來開發lua腳本項目。
回復 支持 反對

使用道具 舉報

21

主題

107

帖子

910

積分

Rank: 9Rank: 9Rank: 9

UID
34511
好友
42
蠻牛幣
1391
威望
0
注冊時間
2014-7-15
在線時間
474 小時
最后登錄
2019-8-10

專欄作家

13#
樓主 2019-6-4 20:28:42 只看該作者

本純lua框架只設計了關于“控制層”與“顯示層”的分層結構。 顯示層由C#腳本映射添加unity的生命周期,擴充功能,提高開發效率!
回復 支持 反對

使用道具 舉報

21

主題

107

帖子

910

積分

Rank: 9Rank: 9Rank: 9

UID
34511
好友
42
蠻牛幣
1391
威望
0
注冊時間
2014-7-15
在線時間
474 小時
最后登錄
2019-8-10

專欄作家

14#
樓主 2019-6-4 20:29:57 只看該作者
Feker 發表于 2019-6-4 11:37
用什么Unity版本開發的呢?

lua框架本質上與unity沒有關系。 我在演示框架的Unity 所用版本是2017。 如果你用2018/2019,基本沒有任何區別。
回復 支持 反對

使用道具 舉報

5熟悉之中
647/1000
排名
15909
昨日變化

6

主題

396

帖子

647

積分

Rank: 5Rank: 5

UID
313764
好友
1
蠻牛幣
333
威望
0
注冊時間
2019-2-13
在線時間
209 小時
最后登錄
2019-8-12
15#
2019-6-21 15:05:43 只看該作者
厲害厲害學到了
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 注冊帳號

本版積分規則

女校游泳队彩金