XLua热更新三部曲
XLua热更新框架简介
XLua是腾讯开发的开源框架。为了在Unity、 .Net、 Mono等C#环境, 方便lua代码和C#相互调用。在用户无感知的情况下进行游戏逻辑的修复工作,不用停服。
框架安装
下载github文件(XLua github链接),解压缩后,将Assets目录中的内容(下图1),放到unity工程里的Assets中。
访问文件的三种方式
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 文件