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

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

热更新之lua框架设计的更多相关文章
- 项目升级,为了热更新使用lua。
现在发行商的要求越来越变态,必须要求程序热更新,以应对上线后的bug及时调整,我们目标锁定在 ulua, slua,(也对L#感兴趣过),一开始对 ulua 很困惑,unity 的 assetstor ...
- 手游为什么要热更新,C#为什么不能热更新,LUA为什么可以
热更新是什么?简单的说就是打补丁,只补需要部分,不用重个游戏包重打上传 热更新问题的本质是代码更新而不是资源更新,为什么呢? 大型手游都是将补丁资源放在专门的WEB服务器上,游戏启动时动态下载并放入到 ...
- 使用 Swoole 加速你的 CMS 系统,并实现热更新 (基于 Laravel 框架)
主题:使用 Swoole 加速你的 CMS 系统,并实现热更新 关于 Swoole 的简介不再在此赘述,各位可以自行查看官网的文档进行详细的了解. 本文以 MyCms 为例,简要说明 Swoole 结 ...
- 热更新语言--lua学习笔记
一.lua安装和编程环境搭建 lua语言可以在官网:http://luadist.org/下载安装包安装,编程IDE之前学习使用的是SciTE(https://www.cnblogs.com/movi ...
- 客户端热更新框架之UI热更框架设计(上)
什么是热更新,为什么需要热更新? 热更新是目前各大手游等众多App常用的更新方式.简单来说就是在用户通过App Store下载App之后,打开App时遇到的即时更新.对于手游客户端来 ...
- [Cocos2d-x]Lua 资源热更新
什么是热更新 所谓的热更新,指的是客户端的更新. 大致的流程是,客户端在启动后访问更新的URL接口,根据更新接口的反馈,下载更新资源,然后使用新的资源启动客户端,或者直接使用新资源不重启客户端. 热更 ...
- 热更新(一) 之Lua语法的学习
热更新 如热更新果需要更换UI显示,或者修改游戏的逻辑,这个时候,如果不使用热更新,就需要重新打包,然后让玩家重新下载(浪费流量和时间,体验不好).热更新可以在不重新下载客户端的情况下,更新游戏的内容 ...
- Unity 安卓下DLL热更新一(核心思想)
大家都知道一谈起热更新的话首选是Ulua这个插件, 其实Unity可以使用dll热更新的,如果你实在不想用Lua来编写逻辑,0.0请下看Dll+AssetBundle如何实现热更新的.让你看完这个文章 ...
- 深入理解xLua热更新原理
热更新简介 热更新是指在不需要重新编译打包游戏的情况下,在线更新游戏中的一些非核心代码和资源,比如活动运营和打补丁.热更新分为资源热更新和代码热更新两种,代码热更新实际上也是把代码当成资源的一种热更新 ...
随机推荐
- 获取select框下option所有值
document.getElementById('roomId').options[0].value;获取第一个值 var roomIds = $("#roomId option" ...
- java web项目为什么我们要放弃jsp?(转)
前戏: 以前的项目大多数都是java程序猿又当爹又当妈,又搞前端(ajax/jquery/js/html/css等等),又搞后端(java/mysql/Oracle等等). 随着时代的发展,渐渐的许多 ...
- GO111MODULE的设置(及GOPROXY)
环境:win7 go1.13.1 早听说GO111MODULE大名,今天才测试成功,步骤如下: 因为我的Go version >= 1.13,直接用go env -w 设置(注意大小写) go ...
- 关于matlab GUI 的一些总结
最近在 用matlab做一个GUI的用户界面 大多都是百度出来 摸索的学习 总结一下遇到的一些问题和解决方法 一: 在文本框动态显示文本 (保留之前的文本并显示当前文本内容): 在文本框显示文本 基本 ...
- 在centos7上使用packstack安装openstack
简介 Packstack主要是由Redhat推出的用于概念验证(PoC)环境快速部署的工具.Packstack是一个命令行工具,它使用Python封装了Puppet模块,通过SSH在服务器上部署Ope ...
- lodop打印设计
<template> <div class="dashboard-container"> <form id="form1"> ...
- Print工具类
这篇文章已经废弃. 实际开发中,打印信息只会用日志框架(Log4j2). 受到Thinking in Java中静态引入(import static)的启发, Deolin也打算写一个方便自己的工具类 ...
- Are Lights Still On?
不知不觉成为一名OIer已经接近一年了,但真正开始认真对待还是这个暑假,从当初的信心百倍,踌躇满志,到现在陷入了迷茫. 我不知道自己是否真的热爱OI这项事业,可我不愿放弃:我也不知道自己还有没有继续学 ...
- pwn学习日记Day17 《程序员的自我修养》读书笔记
静态链接章小结 本章首先学习了静态链接的第一步骤,即目标文件在被链接成最终可执行文件时,输入目标文件中的各段是如何被合并到输出文件中的,链接器如何为它们分配在输出文件中的空间和地址.一旦输入段中的最终 ...
- JMeter压力测试及并发量计算-2
一个每天1000万PV的网站需要什么样的性能去支撑呢?继续上一篇,下面我们就来计算一下,前面我们已经搞到了一票数据,但是这些数据的意义还没有说.技术是为业务服务的,下面就来说说怎么让些数据变得有意义. ...