gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 03:37:24 26 4
gpt4 key购买 nike

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

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

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

如何最好地改变这一点以使流程有效?

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

最佳答案

My first thought is to not save a reference to the function directly, but maybe save the function name instead, and grab the function by name every time we want to call it.

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


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


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

关于c++ - 我如何链接到 Lua 中的回调函数,以便在重新加载脚本时更新回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10454754/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com