https://www.cnblogs.com/herenzhiming/articles/8460854.html
这种是建议的方式,性能好很多,而且类型安全。缺点是要生成代码(如果没生成代码会抛InvalidCastException异常)。
delegate要怎样声明呢?
对于function的每个参数就声明一个输入类型的参数。
多返回值要怎么处理?从左往右映射到c#的输出参数,输出参数包括返回值,out参数,ref参数。
参数、返回值类型支持哪些呢?都支持,各种复杂类型,out,ref修饰的,甚至可以返回另外一个delegate。
delegate的使用就更简单了,直接像个函数那样用就可以了。
void LoadGlobalFun1()
{
string script = @"
function fun1()
print(10+20);
end
";
LuaEnv luaEnv = new LuaEnv();
luaEnv.DoString(script);
Action fun1 = luaEnv.Global.Get<Action>("fun1");
fun1();
}
[CSharpCallLua]
public delegate void FDelegate(int a, string b);
void LoadGlobalFun2()
{
LuaEnv luaEnv = new LuaEnv();
string script = @"
function fun2(a,b)
print(a);
print(b)
end
";
luaEnv.DoString(script);
FDelegate fun2 = luaEnv.Global.Get<FDelegate>("fun2");
fun2(10, "hh");
}
public class DClass
{
public int f1;
public int f2;
}
[XLua.CSharpCallLua]
public delegate int FDelegate2(int a, string b, out DClass c);
void LoadGlobalFun3()
{
string script = @"
function fun3(a, b)
print('a', a, 'b', b)
return 1, {f1 = 1024}
end
";
luaEnv.DoString(script);
FDelegate2 fun3 = luaEnv.Global.Get<FDelegate2>("fun3");
DClass c;
Debug.Log(fun3(10, "hh",out c));
}
[CSharpCallLua]
public delegate Action GetE();
void LoadGlobalFun()
{
string script = @"
function ret_e()
print('ret_e called')
return e
end
";
GetE ret_e = luaenv.Global.Get<GetE>("ret_e");
Action e = ret_e();
e();
}
这种方式的优缺点刚好和第一种相反。
使用也简单,LuaFunction上有个变参的Call函数,可以传任意类型,任意个数的参数,返回值是object的数组,对应于lua的多返回值。
两种重载方法:
object[] Call(params object[] args) 描述:
以可变参数调用Lua函数,并返回该调用的返回值。
string script = @"
function fun(a,b)
return a+b,a-b
end
end
";
luaEnv.DoString(script);
LuaFunction fun = luaEnv.Global.Get<LuaFunction>("fun");
object[] objs = fun.Call(5, 15);
foreach (object obj in objs)
{
Debug.Log(obj);
}
object[] Call(object[] args, Type[] returnTypes) 描述:
调用Lua函数,并指明返回参数的类型,系统会自动按指定类型进行转换
public class DClass
{
public int f1;
public int f2;
}
string script = @"
function fun(a, b)
print('a', a, 'b', b)
return 1, {f1 = 6}
end
";
LuaEnv luaEnv = new LuaEnv();
luaEnv.DoString(script);
LuaFunction fun = luaEnv.Global.Get<LuaFunction>("fun");
object[] objs = fun.Call(new object[] { 11, "sdsd" }, new Type[] { typeof(int), typeof(DClass) });
foreach (object obj in objs)
{
Debug.Log(obj.GetType());
}
Debug.Log(objs[0]);
Debug.Log((objs[1] as DClass).f1);