如何自动初始化组件参数?

在制作一个使用.lua文件读取参数值的游戏引擎时,我卡住了,因为我需要读取这些值并将它们分配给C++中每个组件的参数。我试图调查Unity是如何做的,但我没有找到它(我开始怀疑Unity是否需要这样做)。

我希望参数能够自动初始化,而无需用户为每个参数执行以下处理:

myComponentParameter = readFromLuaFile("myParameterName")

我的最初想法是使用std::variant类型,并存储变量数组以自动读取它们。我遇到的问题是:

  • 首先,我不知道std::variant在当前存储的类型是什么(尝试了std::variant :: type,但对于模板不起作用),以便从非类型化的.lua值转换为C++值。参考一下,我的组件初始化看起来像这样:
bool init(luabridge :: LuaRef parameterTable)
{
    myIntParameter = readVariable <int>(parameterTable,“myIntParameter”);
    myStringParameter = readVariable <std :: string>(parameterTable,“myStringParameter”);
    返回true;
}

(readVariable函数已经在这个问题中编写[链接](https://stackoverflow.com/questions/67300592/read-a-list-of-parameters-from-a-luaref-using-luabridge),如果您有兴趣)

  • 第二个问题是,用户需要编写_std :: get(myIntParameter);_,每次他们想访问由variant存储的值,这听起来比让用户阅读参数值更糟糕。

  • 第三个问题是,我无法创建一个_std :: variant <任何类型> _的数组,这是我希望做的以自动初始化参数。

在这种情况下,有没有好的解决方案使init函数不是必需的,并且用户不需要手动设置参数值?

谢谢。

点赞
用户3212865
用户3212865

让我们进一步解释我的评论。简而言之,您需要从

-“用户在某个文件中输入了一些内容”

到:

-“客户端代码可以读取该值而无需使用std :: get”

…这大致意味着:

-“输入验证已完成,值已准备好进行直接使用。”

…这意味着您不会将变量存储在variant中。


最终这是一个设计问题。某个模块必须知道哪些变量名存在以及每个变量名的类型和有效值。

-该模块的输入将是未经验证的值。

-该模块的输出可能是一些常规的c ++结构。

-该模块的主体可能会有一堆这些内容:

config.foo = readVariable <int>(“foo”);
config.bar = readVariable <std :: string>(“bar”);
//您还想在那里验证值-并非所有整数都可能是foo的有效值,
//也许bar必须遵循某些特定规则,等等。

假设在其他地方定义为:

结构配置{
      int fooVariable;
      std :: string bar;
  };

该模块的位置取决于您的应用程序。如果所有预期类型都已知,则没有理由使用“变量”,直接解析。

如果一些事情直到以后才有意义,则可以将其读取为variant。例如,如果您想读取插件将使用的配置值,则尚不能理解它们。

(实际上,即使是稍后重新解析文件或仅将值保存为文本以供以后解析也可以使用)

2021-05-02 10:31:49