【问题标题】:How to share/reuse a Lua script for multiple entities?如何为多个实体共享/重用 Lua 脚本?
【发布时间】:2011-12-21 16:21:47
【问题描述】:

我正处于使用 Lua 脚本编写 C++ 游戏的设计/骨架编码阶段,但我遇到了设计问题:

游戏将有许多同种实体的副本,其行为由同一个脚本控制。有没有一种简单的方法可以在单个 lua_state 中在相同类型的实体之间共享脚本?我只能在互联网上找到这个问题被问过几次;我已经阅读了关于在不同的 lua_state 中加载相同脚本是否是一个好主意的混合反馈,而不是关于替代方案的深入反馈。

它很简单而且很安全,但是我认为在创建相同实体类型的每个实例时加载、编译和存储相同字节码的附加副本是一种悲惨的浪费,所以我想找出一个更聪明的解决方案.

这是我想到的两个解决方案。我对编程或 C 或 OO 概念并不陌生,但我仍在学习 Lua,尤其是 Lua/C API。我认为我的想法是合理的,但我什至不确定如何实施它们。:

  1. 在 Lua 脚本中实现 OO,并让每个实体由一个 Lua 对象表示;所有 Lua 逻辑都将作用于该对象。这也将具有允许任何单一实体改变全球环境的好处(或“好处”)。

  2. 使用 setfenv 将每个实体封装在自己的环境中,并从全局空间复制所有函数的引用。据我了解,env 只是一个与默认全局不同的表,但我研究了 setfenv 但我不知道该怎么做。

【问题讨论】:

    标签: scripting lua entity luac


    【解决方案1】:

    1 和 2 只是同一枚硬币的不同面,或多或少。这只是对象去哪里的问题。在类型 1 中,对象是 Lua 脚本的显式部分。这意味着脚本决定了它想如何设置它的对象。

    在类型 2 中,对象是环境。它仍然是一个 Lua 表,但它是由外部代码为其创建的。脚本无法摆脱此对象的限制,除非以外部代码允许的方式。

    对我来说实现类型 1 的最简单方法是使用 Luabind。我有一个 AI 对象作为 C++ 类,Lua 可以从中派生。为该 AI 运行“主脚本”将创建该类的一个实例。您将传递脚本参数,例如它控制的实体的名称,也许它可以用来控制它的引用等。

    类型 2 相当简单。首先,您通过创建一个空表并使用您希望用户能够访问的全局变量来填充它来创建新环境。这些将用于与游戏状态对话(在场景中查找其他对象等)、移动相关实体的方式等。您可以使用一些 metatable 技巧来有效地使这些值不可变和恒定,因此用户以后无法修改它们。

    然后,您使用lua_loadstringlua_loadfile 加载脚本。这会在表示该 Lua 脚本的 Lua 堆栈上放置一个函数。然后使用lua_setfenv 将此表应用为该脚本函数的环境。然后,您可以运行该脚本,传递您希望的任何变量(实体名称等)。

    【讨论】:

    • 我更喜欢想法 2。我希望脚本避免必须查看多个对象。你能解释一下为每个运行的脚本副本设置环境所必需的元表魔法吗?另外我不明白你为什么要使用 lua_loadfile。据我了解,它只是编译脚本而不运行它,因此不会评估函数声明之类的内容。
    • @stands2reason:这就是为什么你用它来代替lua_dofile。因为你不能lua_dofile 提供环境。请记住:脚本本身只是一个函数。您希望该功能在环境中执行。而且您只能将环境附加到堆栈上的函数。所以你必须用lua_loadfile将函数加载到堆栈上,然后将环境附加到它上面,然后执行函数。
    • 所以澄清一下,setfenv 在堆栈上获取一个表,并使其成为即将运行的新 _G。但是,如果您使用的是元表,那这不只是一个空表吗?你能解释一下我将如何设置一个元表来共享这些功能吗?
    • 等等,没关系,我想我现在明白了。这是我的示例 lua_newtable(L); lua_setfenv(L, -2);
    • 等等,没关系,我想我现在明白了。这是我的示例
      首先创建不变表: lua_State * L = lua_open(); <br> luaL_loadfile(L, "scripts/test.lua"); lua_newtable(L); <br> lua_setfenv(L, -2);
    猜你喜欢
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    • 2016-01-05
    • 2018-07-02
    相关资源
    最近更新 更多