UniLua 纯 C# 实现的 Lua 5.2开源项目

我要开发同款
匿名用户2013年04月24日
38阅读
开发技术C#
所属分类其他开发相关、程序开发
授权协议MIT

作品详情

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.cs

framework/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));}}

 

声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论