每行运行 Lua 脚本
本文关键字:脚本 Lua 运行 | 更新日期: 2023-09-27 18:35:58
我正在制作一个游戏,您可以在游戏中使用Lua编写自己的机器人。我正在使用名为NLua的C# Lua库,它基本上就像官方的C库一样工作。
如果用户输入以下代码:
for i=0,10 do -- Repeat 10 times
if (robot:check_clear(0.1)) then -- Check if clear up to 10cm in front
robot:go_foward(0.1) -- Go foward 10cm
else then
robot:turn_right(45) -- Turn 45 degrees
end
end
如您所见,我希望它运行整个代码 10 次。它将继续检查 robot:check_clear(),假设它返回 false。因此,它现在将运行 robot:turn_right(45) 并等待动作完成,因为旋转可能需要 3 秒左右。与go_forward(0.1)相同。我该如何让它等待才能继续前进?
现在我使用 lua.DoString(code);
来执行所有代码。问题是它不会等待才能继续前进。
代码中的机器人指的是我称之为LRobot的C#类。它是通过执行此lua["robot"] = new LRobot();
来分配的
我是Lua和Lua C/C#库的新手,所以我非常感谢详细的答案。我不希望有人为我编写代码,只是想知道键盘命令以及如何构建这一切。
提前感谢!
一个相对简单的解决方案 (IMO) 是使用协程。最终,您的代码将如下所示:
robot:go_foward(0.1)
wait_till_robot_stops()
robot:turn_left()
wait_till_robot_stops()
robot:go_foward(0.1)
wait_till_robot_stops()
alert("I'm home!")
"wait_till_robot_stops()"会冻结你的函数,直到机器人休息。如何实现?这很容易。这个 wait() 函数只是对 coroutine.yield() 的调用。这会使您的函数(您的协程)进入睡眠状态。
现在,如何唤醒您的协程?这很容易。当机器人移动停止时,您的游戏应该在 Lua 端调用一些函数。我们称之为on_robot_stop()
.此函数将在休眠协程上调用 coroutine.resume()。
稍后,您可以通过使用wait()函数来等待某些事件,从而使系统更复杂(但更有趣):
robot:go_foward(4)
wait_for("robot rests")
robot:go_foward(2)
wait_for("incomming missile")
robot:raise_shield()
一种选择是让机器人类的命令在命令执行之前不返回。这可能意味着在单独的线程上运行用户的 Lua 状态。如果无法检查完成情况,则可以估计时间并使用以下内容:
System.Threading.Thread.Sleep(TimeSpan.FromSeconds(10));