c++ - 如何将命名空间添加到 Lua?
问题描述
我在我正在开发的游戏引擎中使用 Lua。我想给 Lua 一种方法来获取和设置脚本所在实体的位置。该脚本是一个组件,其中包含指向包含它的实体的指针。在 Lua 中,我希望能够输入:
print(transform.position.x)
transform.position.x = 10
我已经为位置编写了一个 getter 和 setter,我希望它们包含在 下transform.position
,最好根本不是 getter 和 setter,而是表现得更像公共成员。我当前的 getter 和 setter 如下所示:
int getXPosition(lua_State* L) {
lua_pushnumber(L, Script::currentEntity->get<Transform>().position.x);
return 1;
}
那么,如果可能的话,如何做到这一点?
解决方案
简短的回答:可以使用userdata和metatables来完成。
更多细节:
注册元表,它将成为
position
对象的“类”,并为其注册"__index"
和"__newindex"
元方法:luaL_newmetatable(L, "position_metatable"); lua_pushcfunction(L, &position__index); lua_setfield(L, -2, "__index"); lua_pushcfunction(L, &position__newindex); lua_setfield(L, -2, "__newindex"); lua_pop(L, 1);
写函数
position__index
(它是getter)。这是常规的 C Api 函数,它有 2 个参数:用户position
数据和字段名称。如果字段名称为"x"
,则函数应返回该x
字段的值。写函数
position__newindex
(它是setter)。这是常规的 C Api 函数,它需要 3 个参数:用户position
数据、字段名称和要写入的值。如果该字段是"x"
,则函数应将值写入该x
字段。要将
position
对象从本机代码传递到脚本,请创建用户数据并将其设置为用户数据的元表,例如"position_metatable"
,请参见28.2 –元表。访问字段为
transform.position.x
。