nlua的基本配置使用

近来想测试服务器增加热更新能力,考虑加入lua热更新。

目前鹅厂的xlua也是基于nlua的早期版本开发的,黑历史可以参考(https://www.oschina.net/news/80638/c-net-lua-unity3d

nlua官网(http://nlua.org/

nlua的前身是LuaInterface,2.0.3版后改名为nlua

LuaInterface只具有简单的函数注册和变量值传递的功能,确实看上去像一个简单的interface

nlua后,作者做了一些改进,支持了C#对象不需要注册在lua里使用,调用成员等等(不需要一个个注册,但需要导入namespace,nlua会通过反射进行对象扫描)。

安装流程

创建C#工程,必须.net4.5以上。

通过Nuget搜索NLua,下载安装完成即可。

编译后,可以看到,对C++的dll,分别维护了64位和32位的版本。

传值调用

lua["vint"] = 20;
lua["vstr"] = "from C#";

lua.DoString("vint = vint+1");//执行lua脚本代码
lua.DoString("vstr = 'from lua'");

Console.WriteLine("vint = {0}", lua["vint"]);
Console.WriteLine("vstr = {0}", lua["vstr"]);

函数注册

Lua lua = new Lua();
TestClass obj = new TestClass();

// 注册CLR对象方法到Lua,供Lua调用
lua.RegisterFunction("TestPrint", obj, obj.GetType().GetMethod("TestPrint"));

// 注册CLR静态方法到Lua,供Lua调用
lua.RegisterFunction("TestStaticPrint", null, typeof(TestClass).GetMethod("TestStaticPrint"));

lua.DoString("TestPrint(10)");
lua.DoString("TestStaticPrint()");

这里分别注册了成员函数和静态函数到lua,lua调用顺利完成。

调用文件

Lua lua = new Lua();
lua.DoFile("test.lua");

绑定对象到lua

这是nlua中引入的新特性,相对比较复杂一些

Lua lua = new Lua();
lua["obj"] = new TestClass();
lua.LoadCLRPackage();
lua.DoString(@" import ('nluaTest', 'nluaTest') ");
lua.DoString(@"    obj2 = TestClass()   ");
lua.DoString("obj:TestPrint(3)");
lua.DoString("obj:TestPrint(5)");

我们分别通过C#和lua创建了一个C#中定义的类型的对象。然后调用各自的成员函数都成功了。

这里的lua.LoadCLRPackage是为了自动导入CLR中的框架数据结构类型

而import操作,需要把(assembly, namespace)导入到lua的名称空间。完成后lua就完成了对C#自定义类型的绑定了。

猜你喜欢

转载自blog.csdn.net/narlon/article/details/86159885