lua与c交互遵循的主要思想是,c你需要什么东西,你给我lua说,我帮你生成,你只能用我给你的api来操作这些lua对象,这些api采用了一个栈结构作为和lua交互的存储结构,以约定的方式把参数放入lua栈,以此达成函数调用
因此lua能非常安全的处理在c中生成的对象。
一、lua与c的交互
lua提供了lua_newuserdata的接口可直接将一个c结构传入到lua中,由lua来管理这个对象,该对象没有被引用后,会被lua的垃圾回收自动回收,在回收时会调用__gc方法
二、lua与c#的交互
1、导入类方法到lua
c#也是个托管语言,并且lua并没有给出c#中传入lua_newuserdata的方法。因此c#与lua如何交互呢,参考了项目代码,整理了一下思路,写到这里
比如C#中有个类叫GameObject,继承与Object
那么一个GameObject对象,比如go
go.name 这句代码我们希望他能先到GameObject中去找name属性,再到Object中找name属性。可设计如下图的结构
其中,GameObject为全局表,mtGameObject也是全局表,并且表里包含了C#类GameObject中的所有方法
mtpObject也是一个全局表,其__index指向mtObject(包含C#类Object中的所有方法)
2、传入userdate到lua
有了1中的GameObject全局表,当要传入一个GameObject对象到lua中时
*使用lua_newuserdata方法生成一个size为1的假的userdata对象,并将该userdata的元表设置为GameObject,lua_newuserdata函数返回一个c++结构的对象,在c#中可用IntPtr类型来保存
*以IntPty.ToInt64函数,将返回的userdata转为一个64位数字,以该数字为key,以实际对象为value,保存在c#中的一个字典中
*当lua调用该userdata的方法时,在c#中取出userdat,转为64位的key从对象字典中取出实际对象即可
通过以上方式,即可实现将一个c#对象传入lua中
文笔拙劣,思想肤浅,不足之处欢迎指正