我目前正处于一个游戏项目中,必须将Lua集成到游戏引擎中,以向脚本用户公开游戏对象和组件的界面。
我尝试研究将C ++类对象绑定到Lua的方法,并且我发现大多数文档都解释了如何使用userdata类型。
然而,我们的项目自己管理游戏对象(这意味着我们决定何时删除,创建游戏对象),我想知道我是否可以禁用Lua的垃圾收集。具体来说,我可以尝试将metatable中的__gc
替换为nil或无效的函数吗?
我的补偿是使用包含lightuserdata(this指针)的表和检索'this pointer'的静态函数,并手动调用成员函数。但是,由于程序员应该手动创建包装器静态函数,因此很快就会很难管理。
我是否可以获得正确使用的良好文档或类似问题解决方案的链接?
答案 0 :(得分:3)
如果您的游戏对象由您的游戏引擎管理,只需让您的Lua用户数据对象成为游戏对象的简单指针,这样Lua的GC只会收集它们而不是实际对象。
如果你想让你的对象的生命周期由Lua和C ++管理,你可以使用std::shared_ptr
s来对你的对象,并让Lua userdata也拥有这样一个智能指针,这两者都是世界在相同的参考计数器上运行,即使在Lua管理的指针的情况下还有一些额外的“东西”。
答案 1 :(得分:0)
LuaBridge文档同时描述了如何解决您的问题,并提供了开箱即用的解决方案 - LuaBridge。你不需要自己动手。您也可以考虑使用其他几个绑定库。