将现有的C++对象传递给Lua

我目前正在开发自己的视频游戏引擎,并尝试实现对Lua脚本的支持,以便编写游戏行为。然而,我目前正在为Lua中的C++类挣扎。我知道如何通过lua在堆上创建类的新实例,但那可能不是我想要做的。

我更需要将C++中已经存在的对象传递到Lua中,然后在脚本内部使用它。(例如:引擎有一个怪物的实例,我想为怪物运行一个脚本,以查看它是否看到了玩家-如果是,怪物将攻击玩家)。

我找到的唯一解决方案是这个:将现有的C++对象传递给Lua并调用传递对象的成员函数,但原帖作者使用了需要boost的luabind(我实际上不想使用)。

因此,我的问题是:

我如何将已经在C++中分配的堆中对象传递给Lua脚本?(不使用luabind)

这种方法是否正确?我找到的大部分内容都倾向于回答“如何在Lua中创建C++类的实例”而不是仅仅传递它,这让我想知道我的想法是否正确。

注意:我不介意使用像luabind这样的工具,我只是不想使用它们,因为它们依赖于诸如boost之类的外部库。如果有类似这样的简单解决方案,那么我将非常愿意使用。

点赞
用户3819850
用户3819850

Sol 是一个完美的库的例子,支持 C++11+-like sematics ,包括使用模板传递类类型。如果我是你,我会查看 Sol 的源代码,尝试复制它的对象和数据传递方法。Lua 的“元”功能很可能是建立在它的 userdata 结构之上的,所以建议你从这里开始查找。

顺便说一下,Sol 仅依赖于 Lua,并且仅需包含头文件。只要你使用 Lua 5.2(而不是社区的大焦点 5.3,但不应该有影响,因为 LuaJIT 也在 5.2 上,我相信),就可以直接使用它。

2015-07-07 23:34:12
用户501459
用户501459

大多数我找到的都是来回答如何在 Lua 中创建一个 C++ 类的实例的问题,而不是仅仅通过传递来实现。这让我想到我的想法是否正确。

这些回答也适用于您的问题。您无法在 Lua 中创建 C++ 类。任何类构造将在 C++ 代码中完成。

如果您不使用绑定库,则需要成为 Lua 的 C API 和元表的导出版本(别害怕,它并不难)。

您将 C++ 对象作为“userdata”公开给 Lua。然后,您提供具有“__index”元方法的元表,该元方法允许您编写 C++ 处理程序,用于在访问对象时进行索引,例如当访问属性时(例如“pt.x”)或调用方法时(例如“entity:attack(target)”)。您还需要一个“__gc”元方法,以便当相应的 Lua userdata 被垃圾收集时删除 C++ 对象。

这可以有相当多的样板代码,这就是许多C++绑定库要解决的问题。我从未使用过一个,所以无法推荐一个。然而,由于漏斗抽象原则,我强烈建议您自己尝试一下,这样您就可以理解它的原理。

2015-07-07 23:59:22