找回密码
 注册帐号

扫一扫,访问微社区

刘国柱 热更新之lua框架一分极速PK10

20
回复
2426
查看
打印 上一主题 下一主题
[ 复制链接 ]

21

主题

107

帖子

914

积分

Rank: 9Rank: 9Rank: 9

UID
34511
好友
42
蛮牛币
1399
威望
0
注册时间
2014-7-15
在线时间
478 小时
最后登录
2019-9-12

专栏作家

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

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

x
本帖最后由 liu_guozhu 于 2019-6-3 19:31 编辑

      目前中大型游戏项目包含部分VR与AR项目,都需要热更新与在线修改Bug等功能实现,虽然Xlua等插件已经给出了关于C#与Lua语言之间的双向无缝调用实现,但是就热更新的架构却没有提出,这需要广大游戏公司的开发人员自己来一分极速PK10一套lua框架。
      早期热更新的概念与实现机理刚传入国内实现的时候,很多公司采用纯lua脚本的方式,来构建整个项目。 这种方式开发速度慢,且极易出错,开发效率不高。所以后来各公司就纯lua的热更新技术,自己来进行架构一分极速PK10,引入例如MVC的分层理念,然后通过C#与lua之间的映射方式,来让lua文件获取unity的生命周期函数,以此来获得更高的开发效率。
      笔者认为最好的方式应该把业务功能相对稳定的功能用C#来开发,而lua框架部分也仅仅处理游戏项目中业务需求随事件频繁更新的业务需求,例如游戏中的“每日公告”,“每日任务”等。
     以上问题比较复杂,笔者本篇文章,就纯lua语言来开发一套简单的lua框架系统,实现以上描述的业务功能实现。
     首先为了避免直接深入代码的海洋,先就笔者一分极速PK10的框架给出一个整体一分极速PK10图,供参考。


以上架构图从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代码都与具体的业务功能实现有关系。基本都按照一分极速PK10成对出现,例如本演示项目中的 UIRootCtrl.lua 与UIRootView.lua ,表示加载与显示UI根窗体。*Ctrl.lua定义玩家看不见的业务逻辑,例如加载与解析从服务器端传来的ab包资源,然后关于UI窗体内部的控件显示、显示方位、控件的事件注册等业务,都有*View.lua负责处理。这样实现了架构一分极速PK10中的分层一分极速PK10原理。
    最后值得说明的是,*View.lua是负责显示具体3D/2D游戏预设资源的脚本。其内部定义预设显示的“方式”、“具体内容”与“行为”(包含事件注册)等。而本部分我们采用了xlua的映射技术,使得“lua显示”脚本具备了Unity的常用生命周期函数,进一步大大简化了lua编写业务的难度,例如定义了常见的:Awake()、Start()、Update()、OnDestroy()等函数。
    为了避免编写超长的技术一分极速PK10文章,关于其他代码的具体实现部分,笔者在最后提供lua架构的演示项目下载链接,供广大有兴趣学员学习研究,共同进步。

下载链接与二维码:
      链接:https://pan.baidu.com/s/1BobsN0c_4bBr1LSwF2li3Q
      提取码:bquu



回复

使用道具 举报

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

3

主题

919

帖子

1207

积分

Rank: 6Rank: 6Rank: 6

UID
310426
好友
0
蛮牛币
1692
威望
0
注册时间
2019-1-2
在线时间
189 小时
最后登录
2019-9-18
沙发
2019-6-4 08:40:39 只看该作者

回帖奖励 +2

lua框架一分极速PK10
回复

使用道具 举报

排名
331
昨日变化

82

主题

709

帖子

4124

积分

Rank: 9Rank: 9Rank: 9

UID
93357
好友
6
蛮牛币
20592
威望
0
注册时间
2015-4-18
在线时间
1483 小时
最后登录
2019-9-17

专栏作家认证开发者

QQ
板凳
2019-6-4 09:23:21 只看该作者
Lua 热更新,请问用什么编辑器
回复 支持 反对

使用道具 举报

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

1

主题

256

帖子

676

积分

Rank: 5Rank: 5

UID
213085
好友
5
蛮牛币
527
威望
0
注册时间
2017-3-20
在线时间
379 小时
最后登录
2019-9-16
地板
2019-6-4 09:25:47 只看该作者
学习一下 谢谢!!!!!!!!!!!!
回复

使用道具 举报

6蛮牛粉丝
1032/1500
排名
3928
昨日变化

0

主题

321

帖子

1032

积分

Rank: 6Rank: 6Rank: 6

UID
251353
好友
0
蛮牛币
7516
威望
0
注册时间
2017-10-29
在线时间
331 小时
最后登录
2019-9-10

锦衣玉食

5#
2019-6-4 09:49:35 只看该作者
学习老师的LUA更新
回复 支持 反对

使用道具 举报

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

0

主题

43

帖子

439

积分

Rank: 4

UID
250135
好友
0
蛮牛币
444
威望
0
注册时间
2017-10-22
在线时间
270 小时
最后登录
2019-9-5
6#
2019-6-4 10:14:35 只看该作者
支持刘老师。
回复

使用道具 举报

5熟悉之中
830/1000
排名
4111
昨日变化

1

主题

288

帖子

830

积分

Rank: 5Rank: 5

UID
245227
好友
0
蛮牛币
1020
威望
0
注册时间
2017-9-21
在线时间
181 小时
最后登录
2019-9-18
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熟悉之中
884/1000
排名
10706
昨日变化

0

主题

612

帖子

884

积分

Rank: 5Rank: 5

UID
301976
好友
1
蛮牛币
1324
威望
0
注册时间
2018-10-31
在线时间
174 小时
最后登录
2019-9-18
9#
2019-6-4 14:19:34 只看该作者
MVC确实是很浓。。。
回复

使用道具 举报

7日久生情
2219/5000
排名
4093
昨日变化

0

主题

1479

帖子

2219

积分

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

UID
254705
好友
1
蛮牛币
2005
威望
0
注册时间
2017-11-16
在线时间
378 小时
最后登录
2019-9-18
10#
2019-6-4 15:02:43 只看该作者
666666666666666666666666
回复 支持 反对

使用道具 举报

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

1

主题

134

帖子

398

积分

Rank: 4

UID
281418
好友
0
蛮牛币
629
威望
0
注册时间
2018-5-16
在线时间
221 小时
最后登录
2019-9-18
11#
2019-6-4 16:15:30 只看该作者
lua框架一分极速PK10   
回复 支持 反对

使用道具 举报

21

主题

107

帖子

914

积分

Rank: 9Rank: 9Rank: 9

UID
34511
好友
42
蛮牛币
1399
威望
0
注册时间
2014-7-15
在线时间
478 小时
最后登录
2019-9-12

专栏作家

12#
楼主 2019-6-4 20:26:16 只看该作者
gxguixin123 发表于 2019-6-4 09:23
Lua 热更新,请问用什么编辑器

我推荐用IDEA 配合lua插件,来开发lua脚本项目。
回复 支持 反对

使用道具 举报

21

主题

107

帖子

914

积分

Rank: 9Rank: 9Rank: 9

UID
34511
好友
42
蛮牛币
1399
威望
0
注册时间
2014-7-15
在线时间
478 小时
最后登录
2019-9-12

专栏作家

13#
楼主 2019-6-4 20:28:42 只看该作者

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

使用道具 举报

21

主题

107

帖子

914

积分

Rank: 9Rank: 9Rank: 9

UID
34511
好友
42
蛮牛币
1399
威望
0
注册时间
2014-7-15
在线时间
478 小时
最后登录
2019-9-12

专栏作家

14#
楼主 2019-6-4 20:29:57 只看该作者
Feker 发表于 2019-6-4 11:37
用什么Unity版本开发的呢?

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

使用道具 举报

5熟悉之中
676/1000
排名
15910
昨日变化

6

主题

407

帖子

676

积分

Rank: 5Rank: 5

UID
313764
好友
1
蛮牛币
436
威望
0
注册时间
2019-2-13
在线时间
227 小时
最后登录
2019-9-18
15#
2019-6-21 15:05:43 只看该作者
厉害厉害学到了
回复

使用道具 举报

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

本版积分规则