如何链接到 Lua 中的回调函数,以便在重新加载脚本时更新回调

How can I link to callback functions in Lua such that the callbacks will be updated when the scripts are reloaded?

本文关键字:回调 新加载 加载 更新 脚本 函数 链接 何链接 Lua      更新时间:2023-10-16

我正在使用LuaBind在我的游戏中实现Lua脚本,我不清楚的一件事是在游戏中重新加载脚本的后勤工作。

目前,使用 LuaBind C++类luabind::object,我直接在使用它们的类中保存对 Lua 回调的引用。然后,我可以使用该对象luabind::call_function以便从C++代码调用Lua代码。

我还没有测试过这个,但我的假设是,如果我重新加载脚本,那么所有函数都将被重新定义,但对 OLD 函数的引用仍将以C++代码持有的luabind::object的形式存在。我希望能够将旧的换成新的,而不必为游戏中的每个脚本钩子手动管理它。

如何最好地改变这一点,以便该过程正常工作?

我的第一个想法是不要直接保存对函数的引用,而是保存函数名称,并在每次我们想要调用函数时按名称获取函数。我正在寻找更好的主意!

我的第一个想法是不要直接保存对函数的引用,而是保存函数名称,并在每次我们想要调用函数时按名称获取函数。

如果你的类调用具有已知名称的全局函数,那么这几乎解决了你的问题。无需提前获取参考;它不会产生可衡量的性能差异。我认为call_function无论如何都支持将函数名称作为字符串传递,对吧?


通常在 Lua 脚本注册回调时存储对函数值的引用。在这种情况下,它比存储名称要好得多,因为它允许Lua脚本注册本地,匿名等函数。


如果你真的必须提前获取价值,就像你现在所做的那样(真的没有理由这样做,但我们会假装这是必要的(,我会添加一层间接。你可以有一个封装全局名称的LuaFunctionReference类。在实例化期间,它获取对全局包含的函数的引用。这些对象可以从维护所有此类引用列表的工厂获取。重新加载脚本时,可以让工厂/管理器/pool/etc.对象遍历引用并让它们自行更新,因此隐藏在整个系统中的类中的所有引用都将更新。