gpt4 book ai didi

scripting - 如何为多个实体共享/重用 Lua 脚本?

转载 作者:行者123 更新时间:2023-12-03 08:16:16 25 4
gpt4 key购买 nike

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

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

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

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

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

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

最佳答案

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

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

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

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

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

关于scripting - 如何为多个实体共享/重用 Lua 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8003941/

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