找回密码
 注册帐号

扫一扫,访问微社区

刘国柱 热更新之lua框架设计

19
回复
2230
查看
[ 复制链接 ]

21

主题

107

帖子

910

积分

Rank: 9Rank: 9Rank: 9

UID
34511
好友
42
蛮牛币
1392
威望
0
注册时间
2014-7-15
在线时间
474 小时
最后登录
2019-8-13

专栏作家

2019-6-3 19:23:16 显示全部楼层 阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

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框架系统,实现以上描述的业务功能实现。
     首先为了避免直接深入代码的海洋,先就笔者设计的框架给出一个整体设计图,供参考。
lua框架设计图完善版本.png

以上架构图从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
1.jpg


回复

使用道具 举报

6蛮牛粉丝
1113/1500
排名
10818
昨日变化

3

主题

838

帖子

1113

积分

Rank: 6Rank: 6Rank: 6

UID
310426
好友
0
蛮牛币
1499
威望
0
注册时间
2019-1-2
在线时间
176 小时
最后登录
2019-8-23
2019-6-4 08:40:39 显示全部楼层

回帖奖励 +2

lua框架设计
回复

使用道具 举报

排名
331
昨日变化

82

主题

699

帖子

4090

积分

Rank: 9Rank: 9Rank: 9

UID
93357
好友
6
蛮牛币
20333
威望
0
注册时间
2015-4-18
在线时间
1459 小时
最后登录
2019-8-23

专栏作家认证开发者

QQ
2019-6-4 09:23:21 显示全部楼层
Lua 热更新,请问用什么编辑器
回复 支持 反对

使用道具 举报

5熟悉之中
660/1000
排名
16956
昨日变化

1

主题

251

帖子

660

积分

Rank: 5Rank: 5

UID
213085
好友
5
蛮牛币
511
威望
0
注册时间
2017-3-20
在线时间
368 小时
最后登录
2019-8-23
2019-6-4 09:25:47 显示全部楼层
学习一下 谢谢!!!!!!!!!!!!
回复

使用道具 举报

6蛮牛粉丝
1023/1500
排名
3927
昨日变化

0

主题

317

帖子

1023

积分

Rank: 6Rank: 6Rank: 6

UID
251353
好友
0
蛮牛币
7401
威望
0
注册时间
2017-10-29
在线时间
326 小时
最后登录
2019-8-23

锦衣玉食

2019-6-4 09:49:35 显示全部楼层
学习老师的LUA更新
回复 支持 反对

使用道具 举报

4四处流浪
437/500
排名
9201
昨日变化

0

主题

43

帖子

437

积分

Rank: 4

UID
250135
好友
0
蛮牛币
440
威望
0
注册时间
2017-10-22
在线时间
268 小时
最后登录
2019-8-23
2019-6-4 10:14:35 显示全部楼层
支持刘老师。
回复

使用道具 举报

5熟悉之中
803/1000
排名
4110
昨日变化

1

主题

271

帖子

803

积分

Rank: 5Rank: 5

UID
245227
好友
0
蛮牛币
987
威望
0
注册时间
2017-9-21
在线时间
172 小时
最后登录
2019-8-23
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
2019-6-4 11:37:52 显示全部楼层
用什么Unity版本开发的呢?
回复 支持 反对

使用道具 举报

5熟悉之中
783/1000
排名
10706
昨日变化

0

主题

523

帖子

783

积分

Rank: 5Rank: 5

UID
301976
好友
1
蛮牛币
1171
威望
0
注册时间
2018-10-31
在线时间
162 小时
最后登录
2019-8-24
2019-6-4 14:19:34 显示全部楼层
MVC确实是很浓。。。
回复

使用道具 举报

7日久生情
2132/5000
排名
4092
昨日变化

0

主题

1406

帖子

2132

积分

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

UID
254705
好友
1
蛮牛币
1933
威望
0
注册时间
2017-11-16
在线时间
364 小时
最后登录
2019-8-24
2019-6-4 15:02:43 显示全部楼层
666666666666666666666666
回复 支持 反对

使用道具 举报

4四处流浪
387/500
排名
16594
昨日变化

1

主题

133

帖子

387

积分

Rank: 4

UID
281418
好友
0
蛮牛币
577
威望
0
注册时间
2018-5-16
在线时间
211 小时
最后登录
2019-8-24
2019-6-4 16:15:30 显示全部楼层
lua框架设计   
回复 支持 反对

使用道具 举报

21

主题

107

帖子

910

积分

Rank: 9Rank: 9Rank: 9

UID
34511
好友
42
蛮牛币
1392
威望
0
注册时间
2014-7-15
在线时间
474 小时
最后登录
2019-8-13

专栏作家

楼主 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
蛮牛币
1392
威望
0
注册时间
2014-7-15
在线时间
474 小时
最后登录
2019-8-13

专栏作家

楼主 2019-6-4 20:28:42 显示全部楼层

本纯lua框架只设计了关于“控制层”与“显示层”的分层结构。 显示层由C#脚本映射添加unity的生命周期,扩充功能,提高开发效率!
回复 支持 反对

使用道具 举报

21

主题

107

帖子

910

积分

Rank: 9Rank: 9Rank: 9

UID
34511
好友
42
蛮牛币
1392
威望
0
注册时间
2014-7-15
在线时间
474 小时
最后登录
2019-8-13

专栏作家

楼主 2019-6-4 20:29:57 显示全部楼层
Feker 发表于 2019-6-4 11:37
用什么Unity版本开发的呢?

lua框架本质上与unity没有关系。 我在演示框架的Unity 所用版本是2017。 如果你用2018/2019,基本没有任何区别。
回复 支持 反对

使用道具 举报

5熟悉之中
661/1000
排名
15909
昨日变化

6

主题

402

帖子

661

积分

Rank: 5Rank: 5

UID
313764
好友
1
蛮牛币
370
威望
0
注册时间
2019-2-13
在线时间
217 小时
最后登录
2019-8-24
2019-6-21 15:05:43 显示全部楼层
厉害厉害学到了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则