c# - 每行运行 Lua 脚本

标签 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 次。它将继续检查 robot:check_clear(),假设它返回 false。所以它现在将运行 robot:turn_right(45) 并等待 Action 完成,因为旋转可能需要 3 秒左右。与 go_forward(0.1) 相同。在继续之前,我如何让它等待?

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

代码中的 robot 指的是我称为 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()

关于c# - 每行运行 Lua 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27756345/

相关文章:

C#,将焦点返回到最后处理的窗口

c# - 泛型和父类(super class)型

c# - 我们可以从 C# 中的基类中的子类方法捕获异常吗?

lua - torch/nn - 按元素连接张量数组

lua - 插入到字符串

Lua:完美的克隆功能,为什么不呢?

c# - 使用 ASP.NET Session 进行生命周期管理 (Unity)

在 OSX 上定期调用 C 函数

c - 示例中的变量语法不明确

c - 使用 C 的原始 libcurl JSON PUT 请求