目前中大型游戏项目包含部分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框架设计的更多相关文章

  1. 项目升级,为了热更新使用lua。

    现在发行商的要求越来越变态,必须要求程序热更新,以应对上线后的bug及时调整,我们目标锁定在 ulua, slua,(也对L#感兴趣过),一开始对 ulua 很困惑,unity 的 assetstor ...

  2. 手游为什么要热更新,C#为什么不能热更新,LUA为什么可以

    热更新是什么?简单的说就是打补丁,只补需要部分,不用重个游戏包重打上传 热更新问题的本质是代码更新而不是资源更新,为什么呢? 大型手游都是将补丁资源放在专门的WEB服务器上,游戏启动时动态下载并放入到 ...

  3. 使用 Swoole 加速你的 CMS 系统,并实现热更新 (基于 Laravel 框架)

    主题:使用 Swoole 加速你的 CMS 系统,并实现热更新 关于 Swoole 的简介不再在此赘述,各位可以自行查看官网的文档进行详细的了解. 本文以 MyCms 为例,简要说明 Swoole 结 ...

  4. 热更新语言--lua学习笔记

    一.lua安装和编程环境搭建 lua语言可以在官网:http://luadist.org/下载安装包安装,编程IDE之前学习使用的是SciTE(https://www.cnblogs.com/movi ...

  5. 客户端热更新框架之UI热更框架设计(上)

    什么是热更新,为什么需要热更新?          热更新是目前各大手游等众多App常用的更新方式.简单来说就是在用户通过App Store下载App之后,打开App时遇到的即时更新.对于手游客户端来 ...

  6. [Cocos2d-x]Lua 资源热更新

    什么是热更新 所谓的热更新,指的是客户端的更新. 大致的流程是,客户端在启动后访问更新的URL接口,根据更新接口的反馈,下载更新资源,然后使用新的资源启动客户端,或者直接使用新资源不重启客户端. 热更 ...

  7. 热更新(一) 之Lua语法的学习

    热更新 如热更新果需要更换UI显示,或者修改游戏的逻辑,这个时候,如果不使用热更新,就需要重新打包,然后让玩家重新下载(浪费流量和时间,体验不好).热更新可以在不重新下载客户端的情况下,更新游戏的内容 ...

  8. Unity 安卓下DLL热更新一(核心思想)

    大家都知道一谈起热更新的话首选是Ulua这个插件, 其实Unity可以使用dll热更新的,如果你实在不想用Lua来编写逻辑,0.0请下看Dll+AssetBundle如何实现热更新的.让你看完这个文章 ...

  9. 深入理解xLua热更新原理

    热更新简介 热更新是指在不需要重新编译打包游戏的情况下,在线更新游戏中的一些非核心代码和资源,比如活动运营和打补丁.热更新分为资源热更新和代码热更新两种,代码热更新实际上也是把代码当成资源的一种热更新 ...

随机推荐

  1. Hibernate初探之单表映射——第二章:Hibernate进阶

    第二章:Hibernate进阶 1.hibernate.cfg.xml常用配置 2.session 简介 3.transaction简介 4.session详解 5.对象关系映射常用配置 1.hibe ...

  2. JAVA遇见HTML——Servlet篇:应用MVC架构实现项目

    java关键字“this”只能用在方法方法体内.当一个对象创建之后,java虚拟机就会给这个对象分配一个引用自身的指针,这个指针的名字就是this.只能在非静态方法中使用 package servle ...

  3. 文件传输server.py

    用于局域网机器之间临时互传文件,修复了中文乱码问题 # -*- coding: utf-8 -*- #!/usr/bin/env python3 """Simple HT ...

  4. android studio连接MYSQL8.0报错:java.long.unsupportedOperation处理方案

    纠结了我大概一个星期了! 下载的别人的demo测试,因为还没学线程连接网络啥的 对方使用的版本是MYSQL5.1.14,我使用的8.0.18,同样都是阿里云服务器自建数据库. 由于是版本8.0,所以在 ...

  5. JVM系列-001-JVM监控工具

    JVM系列-001-JVM监控工具 在我们安装的jdk里面的bin目录下有一个jconsole.exe程序.这就是一个JVM的监控工具.我们可以直接打开它,如果配置了环境变量,也可以在命令中直接输入j ...

  6. Java8-Synchronized-No.01

    import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util ...

  7. Linux C打印所有的环境变量

    #include <stdio.h> extern char** environ; int main() { ; ; environ[nIndex] != NULL; nIndex++) ...

  8. BBS 页面搭建知识点整理

    表关系图及建表 from django.db import models # Create your models here. from django.contrib.auth.models impo ...

  9. LInux、xshell(windows)以及finalshell(mac)的常用命令

    一.Linux历史知识: 应用:安装在各种服务器之上,用于嵌入式 版本:内核版本,发行版本(各个公司对其优化) 二.目录介绍 root:系统管理员登录的默认目录 home:其他用户进来的默认目录 us ...

  10. sqlserver中产生随机字符,随机数

    SELECT REPLACE(NEWID(),'-','') select replicate(char(cast(rand()*1000 as int)%26+97) +char(cast(rand ...