一、自定义路径
toLua为我们定义了执行Lua文件的路径"Assets/Lua",那么执行其他路径的lua文件要怎么办呢?
1、在Asset/Lua文件夹下新建一个文件夹“C#CallLua”并在里面创建一个lua文件“Loader.lua”。
此时直接使用luaState.Require执行会报错:module ‘Loader’ not found,因为Require默认只能找到Assets/Lua文件夹下的lua文件。
2、第一种方式:如果文件属于Lua文件夹下,可以直接加父目录
luaState.Require("C#CallLua/Loader");
3、第二种方式:使用AddSearchPath方法添加查找路径
luaState.AddSearchPath(Application.dataPath+"/Lua/C#CallLua");
luaState.Require("Loader");
4、移除搜索路径(使用较少不建议只用)
luaState.RemoveSeachPath(Application.dataPath+"/Lua/C#CallLua");
二、自定义解析方式
要自定义解析方式,需要新建一个类,继承LuaFileUtils,重写加载函数。
1、新建一个脚本LuaCustomLoader并继承LuaFileUtils。
2、重写ReadFile函数。
首先要注意到的是,不管从ab包中加载还是从res中加载,都不支持用.lua后缀,所以tolua加上了bytes后缀,当然我们自己也可以加上.txt后缀,所以我们要在传入的fileName后面加上“.lua”
完整代码如下,重写中包含了从res加载和从ab包加载两种方式
public override byte[] ReadFile(string fileName){
//Debug.Log("自定义解析方式"+fileName);
//如果想要重新定义 解析lua的方式 那么只需要在该函数中去写逻辑即可
//如果没有lua后缀,加上lua后缀,不管从ab包中加载还是从res中加载,都不支持用.lua后缀,所以tolua加上了bytes后缀
//我们自己可以加上.txt后缀
if (!fileName.EndsWith(".lua")){
fileName += ".lua";
}
byte[] buffer = null;
//因为进行热更新的lua代码 肯定是我们自己写的上层lua逻辑
//从ab包中加载lua文件
//C#CallLua/Lesson2_Loader可能传入这样的名字,但是在AB包中只需要文件名,所以需要拆分一下
string[] strs = fileName.Split('/');
//加载ab包中的lua文件
TextAsset luaCode = ABMgr.GetInstance().LoadRes<TextAsset>("lua",strs[strs.Length-1]);
if(luaCode!=null){
buffer = luaCode.bytes;
Resources.UnloadAsset(luaCode);
}
//tolua的自带逻辑和自带lua类,我们不太需要热更新,直接从resources中加载即可
if(buffer == null)
{
//从resources中加载lua文件
string path = "Lua/"+fileName;
TextAsset text = Resources.Load<TextAsset>(path);
if(text!=null)
{
buffer = text.bytes;
//卸载使用后的文本资源
Resources.UnloadAsset(text);
}
}
return buffer;
}
3、在初始化luastate之前 new一个LuaCustomLoader。
new LuaCustomLoader();
因为LuaFileUtils中有一个构造函数:
public LuaFileUtils()
{
instance = this;
}
在new的时候单利就会变成重新构造的类。
4、点击Lua->Copy Lua Files To Resources将Lua文件夹下所有lua文件复制到Resources中