Xlua热更新流程总结


本文提供全流程,中文翻译。

Chinar 坚持将简单的生活方式,带给世人!

(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例)

Chinar —— 心分享、心创新!

记录 Xlua 完成热更新流程

为新手节省宝贵的时间,避免采坑!

Chinar 教程效果:



全文高清图片,点击即可放大观看 (很多人竟然不知道)


1

Description —— 描述

Xlua 是腾讯出品的热更新方案

由于其开源,且热更新方案简单易用,便于开发者对代码进行维护与修改,而得到广泛认可

这里 Chinar 对 Xlua 实现热更新的流程与坑进行一些记录与说明


2

Xlua Import and Open Hotfix —— Xlua导入项目并且开启热更新

导入 Xlua /到项目中后,我们需要在设置面板开启热更新才可以完全使用

输入命令后,一定要回车,然后等待编译!




3

Generate and Inject Scripts —— 生成与注入脚本文件

当工程中 Script /脚本文件有变更的时候

例如增加/删除/增加标签[Hotfix]/增加函数标签[LuaCallCSharp]

注意:只要有任何变动,就需要重新生成和注入脚本

另外如果出现花式报错时,就清除所有,并重新生成和注入




4

Custom LuaLoader —— 自定义Loader

为了测试在工程中调用 Lua 文件

新建一个脚本 ChinarHotFix ,并挂载当前场景

新建一个 Lua 文件放在一个目录下(因为我们自定义的Loader,是要指定该目录中的Lua文件的)

注意:

Lua文件的后缀名,要与函数中的 路径后缀 保持一致

C# 文件:

using System.IO;
using System.Text;
using UnityEngine;
using XLua; /// <summary>
/// 热更新测试脚本——该脚本新建一个 Lua环境,并完成对 Lua脚本的指向调用
/// </summary>
public class ChinarHotFix : MonoBehaviour
{
private LuaEnv luaEnv; //声明一个Lua环境对象 void Start()
{
luaEnv = new LuaEnv(); //实例化一个
luaEnv.AddLoader(ChinarLoader); //添加Loader
luaEnv.DoString("require'ChinarLuaTest'"); //引用名为: ChinarLuaTest 的 Lua 脚本
} /// <summary>
/// 自定义一个 Loader
/// </summary>
/// <param name="luaFileName">Lua文件名</param>
/// <returns>字节组</returns>
private byte[] ChinarLoader(ref string luaFileName)
{
return Encoding.UTF8.GetBytes(File.ReadAllText(@"C:\Users\Administrator\Desktop\ChinarXLuaDemo\LuaFiles\" + luaFileName + ".lua")); //读指定目录下的 Lua 文件,并返回字节组
}
}

Lua 文件:

print('Chinar')

5

Before the LuaEnv.Dispose —— 释放Lua环境之前

运行后需要对 LuaEnv 环境进行释放

释放 LuaEnv 之前还要反注册,那些注册到C#中的回调函数

不然就会造成 LuaEnv 已经释放了,但是 Xlua 机制中的 Delegate 中的函数回调并没有被释放



直接新建一个 Lua 脚本,专门管理并释放 Delegate 中的函数的释放

例如:你通过Lua脚本 xlua.hotfix(CS.ChinarTest,'ChinarTestMethod',function) 注册到 C# 中的函数

则通过新建一个 Lua 脚本ChinarDispose.lua,写上 xlua.hotfix(CS.ChinarTest,'ChinarTestMethod',nil) 质空,即可完成释放

注意:每通过Lua脚本修改一个C#函数,都需要在ChinarDispose.lua脚本中添加对应函数的释放/删除操作

更改后,可进行双清、释放的 C# 文件:

using System.IO;
using System.Text;
using UnityEngine;
using XLua; /// <summary>
/// 热更新测试脚本——该脚本新建一个 Lua环境,并完成对 Lua脚本的指向调用
/// </summary>
public class ChinarHotFix : MonoBehaviour
{
private LuaEnv luaEnv; //声明一个Lua环境对象 void Start()
{
luaEnv = new LuaEnv(); //实例化一个
luaEnv.AddLoader(ChinarLoader); //添加Loader
luaEnv.DoString("require'ChinarLuaTest'"); //引用名为: ChinarLuaTest 的 Lua 脚本
} /// <summary>
/// 自定义一个 Loader
/// </summary>
/// <param name="luaFileName">Lua文件名</param>
/// <returns>字节组</returns>
private byte[] ChinarLoader(ref string luaFileName)
{
return Encoding.UTF8.GetBytes(File.ReadAllText(@"C:\Users\Administrator\Desktop\XluaProjects\LuaFiles\" + luaFileName + ".lua")); //读指定目录下的 Lua 文件,并返回字节组
} /// <summary>
/// 释放掉函数
/// 此函数会在 OnDestroy 之前调用
/// </summary>
private void OnDisable()
{
luaEnv.DoString("require'ChinarDispose'");
} /// <summary>
/// 释放资源
/// 此函数会在最后调用,物体被删除时
/// </summary>
private void OnDestroy()
{
luaEnv.Dispose();
} }

ChinarDispose.lua文件:

xlua.hotfix(CS.ChinarTest,'ChinarTestMethod',nil)
--xlua.hotfix(CS.ChinarTest1,'ChinarTestMethod1',nil)只要有修改C#中对应函数,都需要在这里完成释放操作
--xlua.hotfix(CS.ChinarTest2,'ChinarTestMethod2',nil)
--xlua.hotfix(CS.ChinarTest3,'ChinarTestMethod3',nil)

6

private Variable —— 私有变量

正常情况,我们是无法直接通过 Lua 直接访问到 C# 中的私有变量的

然而 Xlua 机制为我们提供了一个非常简便的解决方案

当我们需要访问某个 C# 类中的私有变量时,只需要在 Lua 代码中加上一句话

xlua.private_accessible(CS.ChinarTest)

然后,我们就可以访问到 C# ChinarTest类中的私有变量了

更改后,可进行双清、释放的 C# 文件:

using UnityEngine;
using XLua; [Hotfix]
public class ChinarTest: MonoBehaviour
{
private int Number = 666;//私有数字变量--例如这么一个私有变量
}

lua文件中加上:

xlua.private_accessible(CS.ChinarTest)--只有加上这句话,才可以访问C#对应类中的私有变量

支持

May Be —— 搞开发,总有一天要做的事!

拥有自己的服务器,无需再找攻略!

Chinar 提供一站式教程,闭眼式创建!

为新手节省宝贵时间,避免采坑!

先点击领取 —— 阿里全产品优惠券 (享受最低优惠)



1 —— 云服务器超全购买流程 (新手必备!)



2 —— 阿里ECS云服务器自定义配置 - 购买教程(新手必备!)



3—— Windows 服务器配置、运行、建站一条龙 !



4 —— Linux 服务器配置、运行、建站一条龙 !




" role="presentation">

技术交流群:806091680 ! Chinar 欢迎你的加入


END

本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究


对于需要复制、转载、链接和传播博客文章或内容的,请及时和本博主进行联系,留言,Email: ichinar@icloud.com


对于经本博主明确授权和许可使用文章及内容的,使用时请注明文章或内容出处并注明网址

XLua热更新用法全流程总结(所有容易出问题的点)的更多相关文章

  1. Unity3D|-XLua热更新用法的大致流程

    xlua是由腾讯维护的一个开源项目,我们可以在github上下载这个开源项目并查看一些相关文档 官网:https://github.com/Tencent/xLua 配置文档:https://gith ...

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

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

  3. Unity 3D中 Ulua-UGUI简单的Demo——热更新的具体流程、使用说明

    Ulua热更新具体流程.使用说明 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 -- 未完 1 -- ...

  4. [XLua]热更新四部曲视频教程+示例源码

    基于Unity2017 xLua是由腾讯维护的一个开源项目,xLua为Unity. .Net. Mono等C#环境增加Lua脚本编程的能力,借助xLua,这些Lua代码可以方便的和C#相互调用.自20 ...

  5. xLua热更新插件

    一.xLua插件下载安装 1.从GitHub上搜索并下载插件 2.将文件复制到unity中 3.检查是否有错误 二.在unity中调用lua 1.简单调用 在c#脚本中使用LuaEnv类可以运行lua ...

  6. 深入理解xLua基于IL代码注入的热更新原理

    目前大部分手游都会采用热更新来解决应用商店审核周期长,无法满足快节奏迭代的问题.另外热更新能够有效降低版本升级所需的资源大小,节省玩家的时间和流量,这也使其成为移动游戏的主流更新方式之一. 热更新可以 ...

  7. 热更新解决方案--xlua学习笔记

    一.热更新方案简介 在Unity游戏工程中,C#代码(编译型语言)资源和Resources文件夹下的资源打包后都不可以更改,因此这部分内容不能进行热更新,而lua代码(解释型语言)逻辑不需要进行预编译 ...

  8. Unity3D热更新方案网摘总结

    参考:http://blog.csdn.net/guofeng526/article/details/52662994 http://blog.csdn.net/u010019717/article/ ...

  9. Unity3D 热更新方案(集合各位专家的汇总)

    http://blog.csdn.net/guofeng526/article/details/52662994 热更新”这个词,在Unity3D的应用下,是有些语义错误的,但是作为大家都熟知的一项技 ...

随机推荐

  1. wget下载阿里云RDS备份集

    [root@localhost tmp]# more wget.sh #!/bin/bash download_url=`python /tmp/geturl.py` echo $download_u ...

  2. 剑指offer(58)对称的二叉树

    题目描述 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 题目分析 主要是要懂得如何去判断对称,比如描述一颗树我们可以通过两个序列就能得 ...

  3. Python3 tkinter基础 Menu add_checkbutton 多选的下拉菜单

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  4. 关于变量,JAVA基本数据类型,运算符类型,如何从控制台接收输入的数据

    一,变量与变量的使用 1.变量是在程序运行中其值可以改变的量,java程序的一个基本存储单元 2.变量的使用 变量类型+变量名 二,JAVA基本数据类型 1.数值型a.整点类型(byte.short. ...

  5. Oracle 实例名/服务名 请问SID和Service_Name有什么区别啊?

    可以简单的这样理解:一个公司比喻成一台服务器,数据库是这个公司中的一个部门. 1.SID:一个数据库可以有多个实例(如RAC),SID是用来标识这个数据库内部每个实例的名字, 就好像一个部门里,每个人 ...

  6. Linux服务器超简单安装Python3环境、Ipython、Jupyter、virtualenv、virtualenvwrapper教程全在这了

    一.网卡配置 vim /etc/sysconfig/network-scripts/ifcfg-ens33 ONBOOT='yes' 二.更换Linux语言环境 1.修改配置文件 vim /etc/l ...

  7. Springboot静态文件不更新的解决办法,以及Springboot实现热部署

    Springboot静态文件不更新的解决办法,以及Springboot实现热部署 原文链接:https://www.cnblogs.com/blog5277/p/9271882.html 原文作者:博 ...

  8. CentOS7.4安装和配置zabbix4.0

    一.安装zabbix前,需要搭建好LAMP环境 二.下载zabbix 进入官网:https://www.zabbix.com/ 更多详细内容请参考官方说明文档,详细的安装要求不贴出来了. https: ...

  9. codeforces 343d

    题意:一棵树结构上有水,往一个节点加水,那么所有的子节点都会有水,或者排干一个节点的水,那么它的上面的节点都会没水. 用dfs序,数组记录区间内全部有水为1,区间内有没水的点就为0. 倒水:区间更新, ...

  10. eslint详细配置

    vue-cli3按照官网教程配置搭建后,发现每次编译,eslint都抛出错误, 修改配置在 .eslintrc.js中修改   或者  关闭eslint 1.关闭eslint 直接注释掉package ...