UH2S2L3——Lua文件加载重定向

本章代码关键字

1
luaEnv.AddLoader()        //添加加载Lua文件函数的方法,要求函数参数接收传入到require语句的字符串,返回脚本文件的byte数组

文件加载重定向

xlua提供了一个路径重定向的方法luaEnv.AddLoader()​,允许我们自定义加载Lua文件的规则
当我们执行Lua语言require​时,相当于执行一个lua脚本,它就会自动执行我们自定义传入的这个函数

首先需要观察该方法的实现

LuaEnv.cs

1
2
3
4
5
6
7
8
9
10
11
12
//...
public delegate byte[] CustomLoader(ref string filepath);

internal List<CustomLoader> customLoaders = new List<CustomLoader>();

//loader : CustomLoader, filepath参数:(ref类型)输入是require的参数,如果需要支持调试,需要输出真实路径。
// 返回值:如果返回null,代表加载该源下无合适的文件,否则返回UTF8编码的byte[]
public void AddLoader(CustomLoader loader)
{
customLoaders.Add(loader);
}
//...

可见,LuaEnv.cs声明了委托CustomLoader​,要求函数的参数列表为ref string filepath,返回值为byte[]
而我们添加的自定义加载Lua文件的方法,会加入到CustomLoader​的列表内,
因此我们的方法需要按照委托CustomLoader​要求的那样声明,再执行AddLoader()​并传入方法

1
2
3
4
5
6
7
8
9
10
11
12
13
void Start()
{
LuaEnv env = new LuaEnv();
env.AddLoader(MyCustomLoader);
env.DoString("require('Main')");
}

private byte[] MyCustomLoader(ref string filePath)
{
//TODO...
Debug.Log("Main");
return null;
}

如果自定义加载函数返回了null,就会执行下一个自定义加载函数,如果都没有找到,就会使用默认路径查找

之后我们再执行env.DoString("require('Lua脚本名')")​,就会自动执行这里的MyCustomLoader()
通过函数中的逻辑,去加载Lua文件,传入的参数是require​执行的lua脚本文件名,通过它即可拼接一个Lua文件所在路径

接下来实现加载方法,首先需要将传入的脚本名拼接为文件路径,再通过File​提供的方法去加载文本文件,读取其内容

1
2
3
4
5
6
7
8
9
10
11
12
13
private byte[] MyCustomLoader(ref string filePath)
{
string path = Application.dataPath + "/Lua/" + filePath + ".lua";
if (File.Exists(path))
{
return File.ReadAllBytes(path);
}
else
{
Debug.LogError("重定向失败,文件名为: " + filePath);
}
return null;
}

image

为了实现热更新,最终我们会去AB包中加载lua文件