c++ - 游戏 Actor 脚本

标签 c++ scripting lua game-engine actor

我想为我的模型/ Actor 添加一些脚本。当加载新模型或更改脚本时, Actor 会使用react。

现在,我有一个 Lua 基类,例如,它有一个 Update() 函数,每个模型/参与者都应该重载该函数。但如何实现呢?主要问题是每个模型都需要一个唯一的类名称,...

  1. 我正在考虑一个表,其键值为 actorID(唯一),该值将是从基类继承的类,但是当重新加载脚本时有点困难。

    对象[ActorID] = 模型(参数)

    Objects[ActorID].Update = function() print("更新: Actor 1") end

  2. 也许也可以为每个参与者创建一个新的 lua 状态。

我的灵感来自于 Leadwerks 引擎:http://www.youtube.com/watch?v=z-EuS1EYk8o

如果有人知道一本关于游戏引擎脚本编写的好书,请告诉我

我想我明白了:

这是一些伪代码:

OnNewActorCreated:

//Add actor
Objects[param.ID] = createClass(baseclass)

//Check if this actor has a script to run.
if param.hasScript then

   //Add the new ID to the script
   Scripts[param.filename][param.ID]

   Entity = Objects[param.ID]

   doFile(param.filename)

   Entity = nil

end

文件更改时:

foreach id in Scripts[changedfile] do

    Entity = Objects[id]

    dofile(changedfile)

    Entity = nil

end

示例脚本:

//check if Entity is valid
if not Entity then
   print("[Error] Entity is invalid")
else   
    function Entity:Update() 
        print(self.name)
     end
end

可以工作;)

最佳答案

YouTube 视频中的引擎工作方式并不依赖于重载的更新函数。它们拥有基类的原因是为其对象提供默认行为和通用接口(interface),但与实际更新任何内容无关。

他们使用操作系统提供的功能来监听文件更新(有关更多信息,请参阅 this SO question),然后只需在游戏的 lua_State 中执行脚本。由于脚本仅修改类型定义(表和元表),因此当您重新加载脚本(通过简单的 luaL_dofile 或我认为的等效方法)时,新定义会覆盖旧定义,并且 lua 会愉快地使用更新的行为。如果您仔细观察视频在编辑器中显示的代码,您会发现它们只是定义函数,而不是运行 Update 方法。

最后一点 - 如果你为每个 actor 创建新的 lua_States,那么你将失去在 Lua 中在它们之间自由传递事物的能力,并且必须编写 C++ 代码在两个(或多个)之间手动传递数据lua_States。

编辑:关于从公共(public)基础对象继承:修改其元表将改变所有对象的行为,因此我们需要防止这种情况发生。一种方法是用防护措施包围实体脚本,防止修改实际的公共(public)元表。在加载脚本之前,我们保存对基本元表的引用,并将其替换为脚本可以使用的拷贝。

通过这种方式,脚本不需要创建自己的元表,也不需要知道引擎的其余部分如何引用它。相反,它只使用实体之一。一旦脚本完成定义其派生行为,我们就可以为其实体拷贝指定一个新名称(基于脚本文件的名称、世界对象的名称等)并将实体恢复为原始引用。

除了上述之外,我们还获得了额外的好处,即不通过不同的更新来持久化更改。每次我们想要在运行时更改脚本时,我们都会重复该过程,并且可以确信,如果在之前的更新中添加了某些内容,那么在执行删除它的更新后,它就不会保留。如果我们只是让脚本覆盖元表,那么如果不显式将函数和成员设置为 nil,我们就无法删除它们。

关于c++ - 游戏 Actor 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12255199/

相关文章:

c++ - 我如何静态链接两个版本的 xerces-c(或与此相关的任何库)?

c# - 将对象公开给 VBScript 时出现 MSScriptControl 'Specified cast is not valid'

bash - 从 Bash 中的文件中删除最后一行

http - luaSocket HTTP 请求总是以重定向(301 或 302)响应

c++ - 使用具有最少 C++/SWIG/Lua 代码的共享 dll 的链接错误

c++ - Lua 5.1 中缺少 luaL_len

c++ - QPair迭代的QHash

c++ - 帮助改进这个INI解析代码

arrays - 在 Bash 中从文本文件创建数组

c++ - OpenCV中不同 channel 数的矩阵逻辑运算