我目前的问题是我有几个敌人共享相同的 A.I.脚本,以及另一个做不同事情的对象。脚本中的函数称为 AILogic。我希望这些敌人独立移动,但事实证明这是个问题。这是我尝试过的。
1) 在敌人的构造函数中调用dofile
,然后在它的Update
函数中调用它的脚本函数,这发生在每个游戏循环中。问题在于 Lua 只使用了最后一个构建的敌人的脚本,所以所有的敌人都在 Update
函数中运行相同的脚本。因此,我上面描述的对象不使用相同的脚本,因为它是 A.I.正在使用其他敌人的脚本。
2) 在Update
函数中调用dofile
,紧接着调用它的script函数。问题是 dofile
在每个对象的更新函数中被调用,所以在 AILogic 函数运行并且该脚本的数据更新后,当为另一个敌人再次调用 dofile 时,整个事情就会被重置.我最大的问题是是否有某种方法可以保留脚本中的值,即使我切换到运行不同的脚本也是如此。
我读过 Lua 中的函数环境,但我不太确定如何正确地实现它们。这是正确的方向吗?感谢任何建议,谢谢。
编辑:我还考虑过创建一个单独的位置来存储该数据,而不是在 Lua 脚本中进行。
Edit2:添加了一些示例代码。 (只是一个让功能正常工作的测试)。
-- Slime's Script
local count = 0;
function AILogic( Slime )
--Make the slime move in circles(err a square)
if count < 4 then
Slime:MoveDir( 0 );
elseif count < 8 then
Slime:MoveDir( 2 );
elseif count < 12 then
Slime:MoveDir( 1 );
elseif count < 16 then
Slime:MoveDir( 3 );
else
count = 0;
end
count = count + 1;
end
最佳答案
lua 解释器将每一行作为其自己的 block 运行,这意味着局部变量具有行范围,因此示例代码不能按原样运行。它要么需要一次全部运行(没有换行符),没有本地人,要么在 do ... 结束 block 中运行。
关于OP中的问题。如果您想共享完全相同的函数(即运行时的相同函数),则该函数需要将数据作为参数。但是,如果您可以使用相同的代码但使用不同的(运行时)函数,则可以使用闭包来保存本地/个人数据。
local function make_counter()
local count = 0
return function ()
local c = count
count = count + 1
return c
end
end
c1 = make_counter()
c2 = make_counter()
c3 = make_counter()
print(c1())
print(c1())
print(c1())
print(c1())
print(c2())
print(c3())
print(c2())
print(c3())
print(c2())
print(c3())
或者,您可以在每次调用函数时使用它的环境,但这只在某些情况下才能正常工作(取决于函数的内部结构)。
关于c++ - 脚本如何通过在 Lua 中加载不同的脚本来保留其值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2353431/