每行运行Lua脚本行

时间:2015-01-03 15:21:05

标签: c# c lua

我正在制作一款游戏,您可以在游戏中使用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次,如您所见。它将继续检查机器人:check_clear(),让它说它返回false。所以它现在将运行robot:turn_right(45)并等待动作完成,因为旋转可能需要3秒左右。与go_forward(0.1)相同。在继续前行之前,我该如何让它等待?

现在我使用lua.DoString(code);来执行所有代码。问题是它在继续之前不会等待。

代码中的 robot 指的是我称为LRobot的C#类。它是通过执行此lua["robot"] = new LRobot();

分配的

我是Lua和Lua C / C#库的新手,所以我要感谢您的详细解答。我不希望有人为我编写代码,只想知道关键命令以及如何构建它们。

提前致谢!

2 个答案:

答案 0 :(得分:3)

一个相对简单的解决方案(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()

答案 1 :(得分:1)

一种选择是在执行命令之前不让机器人类的命令返回。这可能意味着在一个单独的线程上运行用户的Lua状态。如果无法检查完成情况,那么您可以估算时间并使用以下内容:

System.Threading.Thread.Sleep(TimeSpan.FromSeconds(10));