【xLua】C#访问Lua之访问Lua的function

访问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);
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_38211198/article/details/89529519