Xlua
C#调用Lua
lua解析器
lua解析器可以让我们在unity中执行Lua,一般情况下,我们会保证它在unity中的唯一性。
//创建一个lua解析器
LuaEnv env = new LuaEnv();
//执行Lua语言
env.DoString("print('你好世界')");
//像上面这样一句一句的执行lua脚本是非常不好的,所以可以使用lua脚本加载的知识来解决这个问题。
//xlua默认的脚本寻找路径是在Resources文件夹中,但是由于unity并不能识别Lua文件,所以直接加载时会报错的。解决方案是我们将lua后缀多加一个txt,将其转换为文本文件。
env.DoString("require('Main')");
//此方法可以帮助我们清除Lua中我们没有手动释放的对象,相当于垃圾回收。
//我们可以在帧更新中定时执行,也可以在切换场景时执行。
env.Tick();
//销毁Lua解析器,一般会用的会比较少,因为我们之前说过了,我们基本会保证Lua解析器在unity中是全局唯一的。
env.Dispose();
lua文件重定向
//需要调用此方法来添加新的路径,参数为委托类型
//delegate byte[] CustomLoader(ref string filepath)
env.AddLoader(NewLoader);
//这里我们写一个方法并传进去
private byte[] NewLoader(ref string filepath)
{
//路径拼接需要加上后缀
string path = Application.dataPath + "/Lua/" + filepath + ".lua";
if (File.Exists(path))
{
return File.ReadAllBytes(path);
}
return null;
}
//由于委托可以注册多个方法,所以xlua的文件重定向查找方案也是优先查找委托中所有的路径,最后查找默认路径Resources。
//一旦找到对应文件就会返回。不再继续
获取全局变量
//首先我们需要编辑一个test.lua脚本并书写一下信息
print("Test脚本");
testNumber = 1;
testBool = true;
testFloat = 1.2;
testString = "你好";
//在之前的LuaManager中我们添加了一个Global属性,用于获得lua解析器的_G表。
//我们调用xlua的Global中的get方法来获取lua解析器读取的lua脚本中_G表所存放的全局变量。
//注意,字符串内容需要与lua中的变量名一致。
//这里是值拷贝,就算使用临时变量接受了返回值并进行改变也不会影响Lua脚本中的值。
print(LuaManager.GetInstance.Global.Get<int>("testNumber"));
print(LuaManager.GetInstance.Global.Get<bool>("testBool"));
//虽然lua只有一种数值类型number,但是我们可以根据其内容来在C#中为其赋予类型
print(LuaManager.GetInstance.Global.Get<float>("testFloat"));
print(LuaManager.GetInstance.Global.Get<string>("testString"));
//想要改变Lua脚本中的值,我们需要使用Global提供给我们的Set方法。
LuaManager.GetInstance.Global.Set("testNumber",5);
print(LuaManager.GetInstance.Global.Get<int>("testNumber"));
获得全局函数
//我们在test.lua中添加新成员
testFunc1 = function()
print("这是一个无参无返回值的函数");
end
testFunc2 = function(param)
print("这是一个有参有返回值的函数");
return param + 1;
end
testFunc3 = function()
print("这是一个多返回值的函数");
return 1,2,"123";
end
testFunc4 = function(...)
arg = {
...};
print("这是一个有变长参数的函数");
for k,v in pairs(arg) do
print(k,v)
end
end
//总的来说,获得lua的全局函数需要使用到委托。
//这里我们可以使用自定义委托,C#提供的标准委托,或是使用Xlua提供的委托。
//注意使用Xlua提供的委托可能发生拆箱装箱
//我们先来看第一种情况,无参无返回值,我们直接使用Action委托来接受。
Action func1 = LuaManager.GetInstance.Global.Get<Action>("testFunc1");
func1.Invoke();
//第二种情况,有参有返回值,我们直接使用Func委托来接受。
Func<int, int> func2 = LuaManager.GetInstance.Global.Get<Func<int, int>>("testFunc2");
func2.Invoke(10);
//第三种情况,多返回值的函数,我们需要自定义委托来接受。首先我们自定义委托
//当我们要使用自定义委托来接受lua中的全局函数时,我们需要为委托添加[CSharpCallLua]特性,并重新加载。
[CSharpCallLua]
public delegate void FuncHandler(out int paramA,out int paramB, out string paramC);
//使用此委托接受
FuncHandler func3 = LuaManager.GetInstance.Global.Get<FuncHandler>("testFunc3");
int paramA;
int paramB;
string paramC;
func3.Invoke(out paramA,out paramB,out paramC);
//第四种情况,要求输入一个变长参数,我们依旧需要自定义委托来接受。
[CSharpCallLua]
public delegate void FuncHandler2(params object[] array);
FuncHandler2 func4 = LuaManager.GetInstance.Global.Get<

本文详细介绍了C#如何通过Xlua调用Lua,包括Lua解析器的创建、字符串加载、全局变量管理和函数获取,以及如何处理LuaTable、LuaFunction、C#类映射、接口映射等,同时涵盖了协程、泛型和系统类型调用等内容。
最低0.47元/天 解锁文章
610

被折叠的 条评论
为什么被折叠?



