C#编程脚本无需硬编码

4
我正在尝试使用C#脚本创建游戏。我之前问过类似的问题,但示例中涉及到在.cs文件中硬编码。有没有办法编译并运行一个包含C#代码的程序集,其中包含可以更改托管.cs文件中变量的函数、赋值、运算符和类型?
例如:
我的.cs文件包含一个字符串变量myName。
我的脚本代码包含一个名为myfunction的函数。
有没有办法仅通过调用myfunction上的Invoke方法从my function访问myName并更改其在我的.cs文件中的值?而不必在我的.cs文件中硬编码myfunction?
1个回答

11

NLua可以实现你想要的大部分功能,并且非常容易将其集成到你的项目中。

Lua lua = new Lua();
lua.DoString("return 'Hello World!'");

您还可以注册DotNet函数以在脚本文件中使用。

lua.RegisterFunction("print", this, typeof(Program).Print("Print"));

之后,你可以像这样在你的.lua文件中使用它:

function Run()
    print("Hello World!")
end

还有一个与您计划执行的操作特别相关的示例。假设您有一个Actor类:

class Actor
{
    public string name;
    public int age;
}

这是我们如何向脚本介绍我们的DotNet技术:
Lua lua = new Lua();
lua["actor"] = new Actor();

现在到了脚本部分:

function Run()
    actor.name = "Thomas"   
    actor.age = 20
end

在这个例子中,我使用了全局变量,所以Actor类的实例将在所有脚本中都可以访问。这是我们如何将其作为函数参数传递的方法:
Lua lua = new Lua();
lua.LoadFile("Script.lua");
LuaFunction function = lua["Run"] as LuaFunction;
function.Call(new Actor());

你需要提高你的声誉才能做到那一点。感谢你的好意。你可以将我的帖子标记为对你问题的答案。就这样吧。 :) - martynaspikunas
我不知道该怎么做,除了在这里说出来。所以,虽然我不能安装nlua,但我仍然可以安装luaInterface并且需要更深入地研究一下,但我相信这回答了我的问题! - Anoop Alex
Nlua基本上是LuaInterface的新版本,所以我的示例将适用于您。您在使用Nlua时遇到了什么问题?它在说什么?也许与.dll引用有关?我曾经遇到过这个问题,也许我可以帮助您。 - martynaspikunas
当尝试创建Lua对象时,我遇到了"无法加载lua52 DllNotFoundException"的错误。 - Anoop Alex
你需要将lua52.dll放在与项目的.exe文件相同的文件夹中。你不需要在代码中引用它。也许这就是问题所在?当我忘记做到这一点时,我也遇到了相同的异常。 - martynaspikunas
1
你可能想要更新你的最后一个例子,将其改为“Run”,以便与之前的例子中“一个名为Run的函数作为整个脚本”的主题保持一致。 - Guvante

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接