XLua 入门之 C# 访问 Lua
Posted Unity程序猿的学习日常
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XLua 入门之 C# 访问 Lua相关的知识,希望对你有一定的参考价值。
之前了解到在 C# 中获取到 Lua 的全局基本数据类型和 Table,这里再增添获取 Lua 全局的 function。
要实现 Lua 全局 function 的获取,XLua 提供了几种方式。
首先提供这次需要的 Lua 代码内容:
function ev()
print('delegate')
end
function func(x,y)
print('func ' .. x .. y)
end
function func2(x,y)
return x+y
end
function func3(x,y)
return 1,x+y
end
function func4(x,y)
return ev
end
function func5(x,y)
return 1,{a1=1,b2='2'}
end
1、使用 delegate 进行映射(推荐使用)
// 对于 Lua 中 ev 函数 没有参数传入和返回,直接使用 C# 中的 Action 映射
Action ev = luaEnv.Global.Get<Action>("ev");
ev();//执行 Lua 中的 ev 函数
上面只是针对 Lua 中无参数传入和返回的的函数,采用的方式,如果存在传入参数的函数且无返回参数,如下:
[ ]
public delegate void FuncDelegate(int x, int y);
FuncDelegate fd = luaEnv.Global.Get<FuncDelegate>("func");
fd(1, 1);
如果 Lua 中的函数存在输入也存在输出,使用下面方式来映射 delegate:
[ ]
public delegate void FuncDelegate2(int x, int y, out int z);
FuncDelegate2 fd2 = luaEnv.Global.Get<FuncDelegate2>("func2");
int res = 0;
fd2(1, 1, out res);
Debug.Log(res);
如上使用到了 C# 中的 out 实现 Lua 函数中的返回值。这里只是存在一个返回值,存在多个返回值的话:
[ ]
public delegate int FuncDelegate3(int x, int y, out int z);
FuncDelegate3 fd3 = luaEnv.Global.Get<FuncDelegate3>("func3");
int z = 0;
int result = fd3(1, 1, out z);
Debug.Log(result + " " + z);
Lua 函数存在多个返回值的时候,从左到右映射到 C# 的输出参数,输出参数包括返回值,out 参数,ref 参数。返回值类型可以任意,甚至于返回一个 delegate:
[ ]
public delegate Action GetE();
GetE gete = luaEnv.Global.Get<GetE>("func4");
Action ee = gete();//返回的是 lua 中另外的函数,在 C# 中也就是 delegate
ee();//执行返回的 函数
2、使用 LuaFunction 来映射
LuaFunction lf = luaEnv.Global.Get<LuaFunction>("ev");
lf.Call();//无返回值 无参数传入
如果 Lua 中存在函数多参数传入和返回的情况下:
LuaFunction lf2 = luaEnv.Global.Get<LuaFunction>("func5");
object[] objs = lf2.Call(1,1);
Debug.Log(objs.Length);
Debug.Log(objs[0]);
Debug.Log(objs[1]);
在 LuaFunction 中有个变参的 Call 函数,可以传入任意类型和任意个参数,返回值是 object 数组,对应于 Lua 中的多返回值。
XLua 官方对于 C# 访问 Lua 有如下使用建议:
1、访问lua全局数据,特别是table以及function,代价比较大,建议尽量少做,
比如在初始化时把要调用的lua function获取一次(映射到delegate)后,保存下来,后续直接调用该delegate即可。table也类似。
2、如果lua测的实现的部分都以delegate和interface的方式提供,
使用方可以完全和xLua解耦:由一个专门的模块负责xlua的初始化以及delegate、interface的映射,
然后把这些delegate和interface设置到要用到它们的地方。
以上是关于XLua 入门之 C# 访问 Lua的主要内容,如果未能解决你的问题,请参考以下文章