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

摘要:
Xlua热更新过程摘要本文提供了整个过程,并提供了中文翻译。中国坚持为世界带来简单的生活方式!中国——共享与创新!记录Xlua完成热更新过程,为新手节省宝贵时间,避免挖坑!中文教程效果:1描述--描述2XluaImport和OpenHotfix--Xlua导入项目并启用3GenerateandInjectionScripts--生成和注入脚本文件4CustomLuaLoader--自定义Loader5BeforetheLuaEnvDispose--在发布Lua环境之前,6个私有变量--私有变量支持MayBe--在开发中做一些事情,总有一天!

Xlua热更新流程总结


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

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

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


Chinar —— 心分享、心创新!

记录 Xlua 完成热更新流程

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


Chinar 教程效果:



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


1

Description —— 描述


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

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

这里 Chinar Xlua 实现热更新的流程与坑进行一些记录与说明
举个栗子黑白88


2

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


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

输入命令后,一定要回车,然后等待编译!
举个栗子黑白88
这里写图片描述


3

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


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

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

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

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

举个栗子黑白88
这里写图片描述


4

Custom LuaLoader —— 自定义Loader


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

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

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

注意:

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

举个栗子黑白88

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:UsersAdministratorDesktopChinarXLuaDemoLuaFiles" + 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脚本中添加对应函数的释放/删除操作
举个栗子黑白88

更改后,可进行双清、释放的 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:UsersAdministratorDesktopXluaProjectsLuaFiles" + 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类中的私有变量了
举个栗子黑白88

更改后,可进行双清、释放的 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 服务器配置、运行、建站一条龙 !



XLua热更新用法全流程总结(所有容易出问题的点)第9张

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


END

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

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

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

免责声明:文章转载自《XLua热更新用法全流程总结(所有容易出问题的点)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇iOS开发网络篇—多线程断点下载[WinForm] TableLayoutPanel和FlowLayoutPanel的使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Linux-019-Centos Shell 安装 Nginx 后启动时提示找不到Lua模块的libluajit-5.1.so.2文件,具体提示信息:./nginx: error while loading shared libraries: libluajit-5.1.so.2: cannot open shared object file: No such file or directory

Centos Shell 安装后启动时提示找不到 lua 模块的 libluajit-5.1.so.2 文件,具体提示信息:./nginx: error while loading shared libraries: libluajit-5.1.so.2: cannot open shared object file: No such file or di...

Python什么是二次开发的意义?python在.net项目采用

任何人都知道python在.net该项目是做什么的啊? 辅助用途,用作“二次开发”。.net站点的话python主要是CGI才用。能够用python编写B/S程序。 解释一下二次开发: 对于Python来说。他本身未定义主函数 , 和LUA一样,他们都是解释语言,须要一个拥有主函数的主语言帮助解释。那么不管是在C/C++/JAVA/C#中都是一样...

lua load

load (chunk [, chunkname [, mode [, env]]]) 加载一个代码块。 如果chunk是一个字符串,代码块指这个字符串。 如果chunk是一个函数,load不断地调用它获取代码块的片断。 每次对chunk的调用都必须返回一个字符串紧紧连接在上次调用的返回串之后。 当返回空串、nil、或是不返回值时,都表示代码块结束。...

Lua学习笔记

1、Lua开发工具(lua for windows)详解及其环境配置 Lua开发工具(lua for window)及其环境配置是本文要介绍的内容,主要是来了解并学习lua开发工具的使用和环境的配置. lua for window 下载地址:http://luaforwindows.luaforge.net/ 它包括: Lua Interpreter(Lu...

Unity热更新 xLua

xLua是Unity3D下Lua编程解决方案,自2016年初推广以来,已经应用于十多款腾讯自研游戏,因其良好性能、易用性、扩展性而广受好评。现在,腾讯已经将xLua开源到GitHub。 2016年12月末,xLua刚刚实现新的突破:全平台支持用Lua修复C#代码bug。 目前Unity下的Lua热更新方案大多都是要求要热更新的部分一开始就要用Lua语言实现...

Lua嵌入到自己的程序中(转)

什么是LuaLua是具有简单数据描述的扩展编程语言(动态解析语言)。它提供了非常好的面向对象编程, 函数式编程(functional programming),数据驱动式编程(data-driven programming),它可以作为一个强大、轻量的脚本语言,供任何需要的程序使用。 Lua 以一个用 clean C 写成的库形式提供。(所谓 Clean...