前言用了2年多的Lua了,然而,却不知道unity的C#是怎么调用到Lua的细节和底层原理,特此学习一下。
先讲讲toluatolua#是Unity静态绑定lua的一个解决方案,它通过C#提供的反射信息分析代码并生成包装的类。它是一个用来简化在C#中集成lua的插件,可以自动生成用于在Lua中访问Unity的绑定代码,并把C#中的常量、变量、函数、属性、类以及枚举暴露给Lua。
它是从cstolua衍变而来。从它的名字可以看出,它是集成了原来的tolua代码通过二次封装写了一个C#与tolua(c)的一个中间层。
下面详细介绍一下C#和Lua的交互细节
一、C#调用Lua
C# 调用Lua文件
1.1 编译tolua.dll
先上一下unity C#和lua交互的流程图,我们项目用的是tolua,unity C#先是生成tolua C#(warp文件),然后通过这些自动生成的tolua C#和tolua C交互。
tolua C 起到承上启下的作用,是C#和lua的中间层,在和C#交互方面,作为非c#托管代码,会提供一些函数让c# DllImport,c#会通过Marshal等与非托管代码交互
还有一些lua的扩展库,比如 cjson、LuaSocket、sqlite3、lpeg、bit、pbc等手机游戏常用库,这些库扩展了lua的能力,具体编译过程见 如何编译各平台使用的库-以编译tolua为例 这边不足赘述。windows平台叫做tolua.dll,
android叫做libtolua.so,
mac平台叫tolua.bundle,
而iOS平台由于不允许使用动态库,所以会编译成静态库libtolua.a。
编译出tolua.dll,复制到unity的Plugins文件夹下,然后就可以在C#层以DllImport导入接口,然后就可以在C#层调用到C层的方法了。
1.2 C#调用Lua文件
//C# 层调用 lua层 LuaState m_LuaState= new LuaState();
//手动添加一个lua文件搜索地址 m_LuaState.AddSearchPath(string.Format(&