如何向 Lua 添加命名空间?

我正在开发一个游戏引擎,其中使用 Lua。我想给 Lua 添加一种获取和设置脚本所在实体的位置的方法。该脚本是一个包含指向所包含实体的指针的组件。从 Lua 中,我想要输入以下命令:

print(transform.position.x)
transform.position.x = 10

我已经编写了一个获取器和一个设置器来获取和设置位置,但我希望它们可以在“transform.position”下,并最好不是获取器和设置器,而是更像公共成员。我的当前获取器和设置器如下所示:

int getXPosition(lua_State* L) {
    lua_pushnumber(L, Script::currentEntity->get<Transform>().position.x);

    return 1;
}

那么,如果可能的话,应该如何处理呢?

点赞
用户11695625
用户11695625

短答案:可以使用 userdatametatables 来实现。

更多细节:

  1. 注册 metatable,作为“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);
    
  2. 编写函数 position__index(它是一个 getter)。这是常规的 C API 函数,它需要 2 个参数:position userdata 和一个字段名称。如果字段名称是 "x",函数应该返回 x 字段的值。

  3. 编写函数 position__newindex(它是一个 setter)。这也是一个常规的 C API 函数,它需要 3 个参数:position userdata、字段名称和要写入的值。如果字段是 "x",函数应该将值写入 x 字段。

  4. 要将 position 对象从本地代码传递到脚本中,创建 userdata,并将 "position_metatable" 设置为 userdata 的 metatable,请参阅 28.2 – Metatables 进行示例。

  5. 通过 transform.position.x 访问字段。

2020-07-09 08:20:34