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+yend
function func3(x,y) return 1,x+yend
function func4(x,y) return evend
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 中无参数传入和返回的的函数,采用的方式,如果存在传入参数的函数且无返回参数,如下:


[CSharpCallLua]public delegate void FuncDelegate(int x, int y);
FuncDelegate fd = luaEnv.Global.Get<FuncDelegate>("func");fd(1, 1);


如果 Lua 中的函数存在输入也存在输出,使用下面方式来映射 delegate:


[CSharpCallLua]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 函数中的返回值。这里只是存在一个返回值,存在多个返回值的话:


[CSharpCallLua]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:


[CSharpCallLua]public delegate Action GetE();
GetE gete = luaEnv.Global.Get<GetE>("func4");Action ee = gete();//返回的是 lua 中另外的函数,在 C# 中也就是 delegateee();//执行返回的 函数


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的主要内容,如果未能解决你的问题,请参考以下文章

XLua 入门之 C# 访问 Lua

深入xLua实现原理之C#如何调用Lua

XLua系列讲解_XLua调用C#

lua热更框架之XLua

[Unity XLua]热更新XLua入门-俄罗斯方块实例篇

[xlua]探索笔记之协程