在游戏引擎中,让Lua文件像脚本一样运行而不是配置文件的设计模式是什么?

我正在尝试实现和成功地脚本化游戏却没有使用lua作为配置/回调文件的人一样的设计。我想要如下的功能:

在"EventIncountered.lua"中:

1    moveToPoint(500, 500)
2    -- 运动结束后在此处返回。
3
4    dance()
5    -- 当跳舞等操作完成后返回此处...

在我的游戏中的player类中,我想要这些函数更新玩家位置、动画等字段,并在每个更新帧时进行调整。然后,当玩家达到期望的状态时,lua文件应该在离开的地方继续执行。我知道它是可以实现的,并且类似的问题已经被问过;然而,我从中学到的全部是如何将lua用作配置文件,在特定事件上读取并调用回调函数(我甚至知道有一个问题,问问题的人知道如何做到这一点,但是他在问一个更高级的问题)。我知道有人会愿意分享这个保密的秘密。

点赞
用户3159002
用户3159002

我发现了一个不错的解决方案,其中使用了《游戏编程完整第四版》中的想法。

它描述了一个ProccessManager类,允许排队处理每帧进行处理的进程,直到该进程完成。排队的Process对象将有一些方法来标识其是否完成,并且将调用一个函数指针来处理该进程的帧。

尽管我实际上不再需要此功能,因为我已经更深入地了解了脚本在游戏引擎中的工作原理,但是可以通过将函数暴露给lua来使脚本能够创建和排队进程。

在创建这些进程时,可以指定处理该进程的方法(来自不同脚本的函数或类似的内容),确定该进程是否已完成以及与其他进程完成的依赖关系。

脚本最终会像这样:

-----queue_processes.lua-----

-- queueProcess(fileName, functionName, dependencies)
-- 与这些进程对应的lua函数将需要返回一个特殊值来表示其是否完成。

queueProcess("basic_processes.lua", "moveToRock", 0)
queueProcess("basic_processes.lua", "waitTenSeconds", moveToRock)
queueProcess("basic_processes.lua", "sayHi", waitTenSeconds)

-- 这种方式的有趣之处在于,向该文件中添加逻辑并继续排队进程不会很难,只需完成其他操作
-- 完成或满足特定条件时即可。

你可以使用这个想法来实现许多有趣的脚本功能。我希望这对于像我一样遇到这个问题的人有所帮助。

EDIT : 这是一个需要几段解释的好答案,因此不应该被关闭。至少我能够把它留在这里,这样会有人发现答案。

2014-09-21 00:49:11