[XLua热更新]框架安装和文件访问

137 阅读1分钟

XLua热更新三部曲

XLua热更新框架简介

XLua是腾讯开发的开源框架。为了在Unity、 .Net、 Mono等C#环境, 方便lua代码和C#相互调用。在用户无感知的情况下进行游戏逻辑的修复工作,不用停服。

框架安装

下载github文件(XLua github链接),解压缩后,将Assets目录中的内容(下图1),放到unity工程里的Assets中。

截屏2023-03-07 下午2.16.20.png

访问文件的三种方式

1. 直接执行字符串:LuaEnv.DoString

 luaenv.DoString("print('hello world')")

完整代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua; // 引进包

public class HelloWorld : MonoBehaviour
{
    //XLua 的 环境核心类
    LuaEnv env = null;
    //定义调用unity的系统类
    string strLua = "CS.UnityEngine.Debug.Log('Hello World !')";
    
    // Start is called before the first frame update
    void Start()
    {
        env = new LuaEnv();
        //必须是lua的格式
        env.DoString("print('hello world')"); -- 输出 LUA: hello world
        env.DoString(strLua); -- 输出 Hello World
    }
    private void OnDestroy()
    {
        //释放env
        env.Dispose();
    }
}

2. Resource中加载Lua文件

Resource只支持有限的后缀,放Resources下的lua文件得加上txt后缀

  • 文件名:test.lua.txt
private void Start{
---第一种写法
TextAsset ta=Resources.Load<TextAsset>("test.lua");  //  加载lua文件
env.DoString(ta.ToString()); --运行test里的代码

---第二种写法,用lua的require函数,等价于第一种写法
env.DoString("require 'test'"); -- 直接写文件名,加引号

}


3. 最灵活、最常用的方式 - 自定义Loader

using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using XLua;

public class HelloWorld : MonoBehaviour
{
    //XLua 的 环境核心类
    LuaEnv env = null;
   
    // Start is called before the first frame update
    void Start()
    {
        env = new LuaEnv();
        env.AddLoader(CustomMyLoader); // 调用方法
        env.DoString("require 'LuaScripts'"); // 获得定义目录下的文件
    }

    public static byte[] CustomMyLoader(ref string fileName)
    {
        byte[] byArrayReture = null;
        //获得脚本的路径
        string luaPath = Application.dataPath + "/Scripts/LuaScripts/" + fileName + ".lua";
        //读取lua路径中指定的lua文件
        string strLuaContent = File.ReadAllText(luaPath);
        //数据类型转换
        byArrayReture = System.Text.Encoding.UTF8.GetBytes(strLuaContent);
        return byArrayReture;
         
    }

    private void OnDestroy()
    {
        //释放env
        env.Dispose();
    }
}

根据以上代码,最终执行了/Scripts/LuaScripts/LuaScripts.lua 文件

image.png