1.C#调用lua函数参数为空的问题
在C#中调用以(:)定义的函数传参时,self被第一个参数覆盖,而obj将为空
MessagePanel = {}; function MessagePanel:Test1(obj) --lua调用正常,obj为传入参数,self为MessagePanel本身 --C#调用异常,obj为空,self为传入的参数, print(type(obj)..type(self)) end function MessagePanel.Test2(obj) --lua和C#调用都是正确的 print(type(obj)) end
2.C#调用不到Lua父类函数的问题
在Lua中调用table的元表函数是可以的。
在C#中调用Lua中table的元表函数是找不到的。
3.Lua中调用不到C#对象的父类函数
问题原因,
因为父类没有生成wrap
解决办法,
生成所有父类的wrap,注意中间不能间断(父类的父类都需要);
3.Lua中调用不到C#重载函数
问题原因,
在C#中一个类里面有一个没有参数的类成员函数和一个有一个参数的同名静态函数,在这种情况下wrap的生成就会有问题,先上代码
原函数
public Type GetType();
public static Type GetType(string typeName);
生成的wrap函数
static int GetType(IntPtr L)
{
int count = LuaDLL.lua_gettop(L);
if (count == 1) //注意本行
{
Type obj = LuaScriptMgr.GetTypeObject(L, 1);
Type o = obj.GetType();
LuaScriptMgr.Push(L, o);
return 1;
}
else if (count == 1 && LuaScriptMgr.CheckTypes(L, 1, typeof(string))) //注意本行
{
string arg0 = LuaScriptMgr.GetString(L, 1);
Type o = Type.GetType(arg0);
LuaScriptMgr.Push(L, o);
return 1;
}
代码只贴了有用的部分
因为静态函数不用传递调用对象,成员函数需要传递调用对象,所以他们两个的传入参数个数都是1
从判断语句上看这个第二个判断将永远无法进入所以这个静态函数也就无法调用了
解决办法,
a.如果是自己写的代码尽量避开这种写法;
b.如果是SDK的写法找一下有没有其他的相同重载函数;
c.如果a,b都无法解决。。就手动修改这个判断把第一个判断和第二个判断对掉顺序;
4.Lua中报错 function at line xxx has more than 60 upvalues
function at line xxx has more than 60 upvalues。lua的upvalue是有上限的,这个上限定义在luaconf.h中:
/*
@@ LUAI_MAXUPVALUES is the maximum number of upvalues per function
@* (must be smaller than 250).
*/
#define LUAI_MAXUPVALUES 60
当然不建议修改这个值然后重新编译lua了,如果local变量太多,还是放到table里面吧。
luaconf.h中还定义了其他的一些上限,比如这个:
/*
@@ LUAI_MAXVARS is the maximum number of local variables per function
@* (must be smaller than 250).
*/
#define LUAI_MAXVARS 200