首页 > 解决方案 > 如何将命名空间添加到 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;
}

那么,如果可能的话,如何做到这一点?

标签: c++lua

解决方案


简短的回答:可以使用userdatametatables来完成。

更多细节:

  1. 注册元表,它将成为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数据和字段名称。如果字段名称为"x",则函数应返回该x字段的值。

  3. 写函数position__newindex(它是setter)。这是常规的 C Api 函数,它需要 3 个参数:用户position数据、字段名称和要写入的值。如果该字段是"x",则函数应将值写入该x字段。

  4. 要将position对象从本机代码传递到脚本,请创建用户数据并将其设置为用户数据的元表,例如"position_metatable",请参见28.2 –元表。

  5. 访问字段为transform.position.x


推荐阅读