Xlua Examples学习(二)

04_LuaObjectOrented

主要掌握:

  1. c#中将lua函数添加到c#的委托。举一反三:lua中将lua函数添加到c#的委托。

  2. c#接口调用lua函数。

为什么c#的接口定义前和委托定义前要加 [CsharpCallLua]

首先,我们这里的目的是 c#访问lua

  • 对于接口,映射到lua是table。在《Xlua教程》.doc中说了“访问一个全局的table”的几种方法。如果是interface,其依赖于生成代码,所以要加[CsharpCallLua]。

  • 对于委托,映射到lua是function。在《Xlua教程》.doc中说了“访问一个全局的function”。如果是delegate,其依赖于生成代码,所以要加[CsharpCallLua]。

【补充】除了用c#委托调用lua函数,还可以用Xlua提供的LuaFunction调用lua函数,不依赖生成代码,而且可以传任意类型、个数的参数。返回值是object数组。但性能较低、类型不安全。

在c#中将lua函数加入c#的委托列表

假设我们有一个定义好的c#委托类型和实例(甚至已经绑定了别的函数)

[CsharpCallLua]
public delegate void Func(int a, int b);

void Start()
{
    Func funcObj = null;
    funcObj += FuncFromCS;//别的函数
}

和要绑定的Lua函数,

现在想在c#中将这个lua函数加入该委托列表中。然后触发即可。

注意最终将lua函数添加到委托列表里是在c#里完成的。实际可能还有另一种需求:动态地将某个lua函数添加到c#的委托上。这就要在lua里完成。在《Xlua教程》.doc中的“Lua调用c#”中,介绍了这种方法。继续我们的例子加以说明。现在,InvokeLua.cs里有一个成员变量是一个event对象 JTestAction:

如果不用 csScript:JTestAction('+', JTestLuaActionHandler) 这样的语法,那么也可以这么写(见Tutorial的LuaCallCSharp):

在c#中将table映射到c#的接口

接口比类更灵活,里面可以有方法,也可以有get/set。从文档中得知那么lua中的table可以映射到多种c#类型,使用上有什么限制?参考Examples里面的CSCallLua.cs。

lua中:

c#中:

lua函数传入参数个数不定的映射

lua中:

lua函数返回参数有多个的映射

参考Examples里面的CSCallLua.cs。

lua中:

Last updated