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

How to automatically initialize component parameters?

在制作一个使用 .lua 文件以读取参数值的游戏引擎时,当我不得不读取这些值并将它们分配给 C++ 中每个组件的参数时,我遇到了困难。我试图调查 Unity 的工作方式,但没有找到(而且我开始怀疑 Unity 是否必须这样做)。

我希望参数自动初始化,不需要用户做

的过程
myComponentParameter = readFromLuaFile("myParameterName")

对于每个参数。

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

bool init(luabridge::LuaRef parameterTable)
{
    myIntParameter = readVariable<int>(parameterTable, "myIntParameter");
    myStringParameter = readVariable<std::string>(parameterTable, "myStringParameter");
    return true;
}

(readVariable function is already written , in case you're curious)

对于这种不需要init函数,用户不需要手动设置参数值的情况,有什么好的解决方案吗?

提前致谢。

让我们扩展我的评论。简而言之,你需要从

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

至:

  • "客户端代码无需std::get即可读取值"=50=]
    …大致翻译为:
    “输入验证已完成,值可以直接使用。”

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


归根结底是设计题。某处的一个模块必须知道存在哪些变量名称、每个变量的类型以及有效值。

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

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

  • 那个模块的正文可能会有一堆:

    config.foo = readVariable<int>("foo");
    config.bar = readVariable<std::string>("bar");
    // you also want to validate values there - all ints may not be valid values for foo,
    // maybe bar must follow some specific rules, etc
    

    假设在其他地方定义为:

    struct Configuration {
        int fooVariable;
        std::string bar;
    };
    

该模块所在的位置取决于您的应用程序。如果所有预期的类型都是已知的,就没有理由使用 variant,立即解析即可。

如果某些事情直到后来才有意义,您会阅读变体。例如,如果您想读取插件将使用的配置值,那么您还无法理解它们。

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