访问Lua的function
1.映射到delegate
这种是建议的方式,性能好很多,而且类型安全。缺点是要生成代码(如果没生成代码会抛InvalidCastException异常)。
delegate要怎样声明呢?
对于function的每个参数就声明一个输入类型的参数。
多返回值要怎么处理?从左往右映射到c#的输出参数,输出参数包括返回值,out参数,ref参数。
参数、返回值类型支持哪些呢?都支持,各种复杂类型,out,ref修饰的,甚至可以返回另外一个delegate。
delegate的使用就更简单了,直接像个函数那样用就可以了。
-
无返回值
function add(a,b) print(a+b) end
[CSharpCallLua] delegate void Add(int a, int b);
Add add = luaEnv.Global.Get<Add>("add"); add(10,30);
但是报错了
add = null;//调用完成后,需要置空,没有委托引用没有释放时, luaEnv.Dispose();会报错
-
一个返回值
function add2(a,b) return a+b end
[CSharpCallLua] delegate int Add2(int a, int b);
Add2 add2 = luaEnv.Global.Get<Add2>("add2"); int res = add2(10, 30); print(res); add2 = null;
-
多返回值(out或ref)
function add3(a,b) return a+b,a,b end
[CSharpCallLua] delegate int Add3(int a, int b ,out int resa,out int resb);
Add3 add3 = luaEnv.Global.Get<Add3>("add3"); int resa; int resb; int res3 = add3(10, 30, out resa, out resb); print(res3 + "," + resa + "," + resb); add3 = null;
2.映射到LuaFunction
这种方式的优缺点刚好和第一种相反。
使用也简单,LuaFunction上有个变参的Call函数,可以传任意类型,任意个数的参数,返回值是object的数组,对应于lua的多返回值。
LuaFunction luaFunction = luaEnv.Global.Get<LuaFunction>("add3");
object[] os = luaFunction.Call(1, 2);
foreach (var o in os)
{
print(o);
}