UniLua是一个纯C#实现的Lua5.2,侧重于兼容性。
最朴素的从C#调用lua的一个全局函数的写法:
Lua.GetGlobal("foo");//加载lua中定义的一个名叫foo的全局函数到堆栈Debug.Assert(Lua.IsFunction(-1));//确保加载成功了,此时栈顶是函数fooLua.PushString("test");//将第一个参数(字符串"test")入栈Lua.PushInteger(42);//将第二个参数(整数42)入栈Lua.Call(2,0);//调用函数foo,指明有2个参数,没有返回值//上面的代码相当于lua里一个这样的调用foo("test",42)稍微复杂一点的例子可以参考实例程序里的一些简单写法:参考这个文件Assets/Behaviour/LuaScriptController.cs:
Assets/Behaviour/LuaScriptController.csframework/main.lua
示例代码:
//创建Lua虚拟机varLua=LuaAPI.NewState();//加载基本库Lua.L_OpenLibs();//加载Lua脚本文件varLuaScriptFile="framework/main.lua";varstatus=Lua.L_DoFile(LuaScriptFile);//捕获错误if(status!=ThreadStatus.LUA_OK){thrownewException(Lua.ToString(-1));}//确保framework/main.lua执行结果是一个LuaTableif(!Lua.IsTable(-1)){thrownewException("frameworkmain'sreturnvalueisnotatable");}//从framework/main.lua返回的table中读取awake字段指向的函数//并保存到AwakeRef中(可以将AwakeRef视为这个函数的句柄)varAwakeRef=StoreMethod("awake");//不再需要framework/main.lua返回的table了,将其从栈上弹出Lua.Pop(1);//----------------------------------------------------//在需要的时候可以这样调用AwakeRef指向的lua函数CallMethod(AwakeRef);//----------------------------------------------------//StoreMethod和CallMethod的实现privateintStoreMethod(stringname){Lua.GetField(-1,name);if(!Lua.IsFunction(-1)){thrownewException(string.Format("method{0}notfound!",name));}returnLua.L_Ref(LuaDef.LUA_REGISTRYINDEX);}privatevoidCallMethod(intfuncRef){Lua.RawGetI(LuaDef.LUA_REGISTRYINDEX,funcRef);varstatus=Lua.PCall(0,0,0);if(status!=ThreadStatus.LUA_OK){Debug.LogError(Lua.ToString(-1));}}
评论