gpt4 book ai didi

c++ - 在 C++ 游戏引擎中使用 Lua 定义 NPC 行为

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:39:45 25 4
gpt4 key购买 nike

我正在使用 C++ 开发一个游戏引擎,使用 Lua 处理 NPC 行为。我在设计过程中遇到了一些问题。

对于需要多于一个框架来执行的所有事情,我想使用一个进程链表(它们是 C++ 类)。所以这个:

goto(point_a)
say("Oh dear, this lawn looks really scruffy!")
mowLawn()

会创建一个 GotoProcess 对象,它有一个指向 SayProcess 对象的指针,而 SayProcess 对象有一个指向 MowLawnProcess 对象的指针。这些对象将在 NPC 生成时立即创建,无需进一步编写脚本。这些对象中的第一个将在每一帧更新。完成后,它将被删除,下一个将用于更新。我通过一个 ParallelProcess 扩展了这个模型,它包含多个同时更新的进程。

我发现了一些严重的问题。看看这个例子:我想要一个角色走到 point_a 然后发狂并攻击任何靠近的人。该脚本看起来像这样:

goto(point_a)
while true do
character = getNearestCharacterId()
attack(character)
end

这对我的设计根本不起作用。首先,字符变量会在开始时设置,此时字符甚至还没有开始走到 point_a。然后,由于 while 循环,脚本将永远继续添加 AttackProcesses。

我可以为循环实现一个 WhileProcess 并逐行评估脚本。不过,我怀疑这会提高代码的可读性。

有没有我没有想到的另一种常用方法来解决这个问题?

最佳答案

我认为您提供的方法失去了使用脚本语言的很多优势。它会随着条件和循环而中断。

使用协程,您真正需要做的是:

npc_behaviour = coroutine.create(
function()
goto(point_a)
coroutine.yield()
say("Oh dear, this lawn looks really scruffy!")
coroutine.yield()
mowLawn()
coroutine.yield()
end
)

goto、say 和 mowLawn 立即返回,但在 C++ 中启动操作。一旦 C++ 完成这些操作,它就会调用 coroutine.resume(npc_behaviour)

为了避免所有的产量,你可以将它们隐藏在 goto 等函数中,或者做我做的有一个 waitFor 函数,比如:

function waitFor(id)
while activeEvents[id] ~= nil do
coroutine.yield()
end
end

activeEvents 只是一个 Lua 表,它跟踪所有当前正在进行的事情 - 所以 goto 会在它开始时向表添加一个 ID,并在它结束时将其删除,然后每次操作完成时,所有协程都被激活以检查它们正在等待的操作是否已完成。

关于c++ - 在 C++ 游戏引擎中使用 Lua 定义 NPC 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6175507/

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