unity3D Xlua热更新流程

3 篇文章 0 订阅

基于unity3D的xlua热更新流程

Description —— 描述

Xlua 是腾讯出品的热更新方案
由于其开源,且热更新方案简单易用,便于开发者对代码进行维护与修改,而得到广泛认可
这里 Chinar 对 Xlua 实现热更新的流程与坑进行一些记录与说明

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

导入 Xlua /到项目中后,我们需要在设置面板开启热更新才可以完全使用
输入命令后,一定要回车,然后等待编译!
在这里插入图片描述

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

当工程中 Script /脚本文件有变更的时候
例如增加/删除/增加标签[Hotfix]/增加函数标签[LuaCallCSharp]
注意:只要有任何变动,就需要重新生成和注入脚本
另外如果出现花式报错时,就清除所有,并重新生成和注入。在这里插入图片描述

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 文件,并返回字节组
    }
}

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)

private Variable —— 私有变量

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

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

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

xlua.private_accessible(CS.ChinarTest)

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

using UnityEngine;
using XLua;

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

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值