0

我已经发现了问题的原因。下面已经发布了答案。


编辑:问题已经改变,请参阅“问题”部分。

我正在使用 LuaInterface。使用这个库的 lua 函数的通用调用有这个签名LuaFunction.Call(params object[] args)。我创建了一个包装函数,它从库中捕获异常并将它们格式化以显示在游戏内控制台窗口上。

我正在尝试调用一个 lua 函数,但它没有接收到参数。这是 C# 中的行

Game.Instance.scriptEngine.Call("GenerateChunk", chunks[chunkID], GetChunkGridPosition(chunkID));

这只是简单地包装了对这个 Lua 函数的调用,该函数接受两个参数:

//lua
function GenerateChunk(worldChunk, chunkGridPosition)
    Log(LogLevel.Error, worldChunk.ToString());
    Log(LogLevel.Error, chunkGridPosition.ToString());
end

它只是回调一个 C#Log函数(正确解析,并且在 Lua 上下文中可见)。

问题是我"invalid arguments to method call"在尝试调用该GenerateChunk函数时从 luainterface 收到错误,并将其返回:


invalid arguments to method call
   at JASG.ScriptEngine.LuaError(Exception ex) Scripting\ScriptEngine.cs:line 144
   at JASG.ScriptEngine.Call(String fnName, Object[] args) Scripting\ScriptEngine.cs:line 86
   at JASG.ChunkManager.WakeChunk(Int32 chunkID) World\ChunkManager.cs:line 123
   at JASG.ChunkManager.GetChunk(Int32 chunkID, Boolean wakeIfAsleep) World\ChunkManager.cs:line 53

我尝试了各种调用该方法的ScriptEngine.Call方法,尝试将参数包装在 object[] 数组等中,但没有骰子。任何想法为什么 lua 没有收到我传递的论点?我已经验证了两个参数在传入时在 C# 中都是非空的。

4

3 回答 3

0

我错误地将问题识别为对 Lua 的调用。我收到的错误消息实际上源于 Lua 脚本回调到我的 C#Log函数中。

我发现尽管将枚举暴露LogManager.LogLevel给 lua 脚本环境,但 Lua 不支持枚举类型。因此,

Log(LogLevel.Debug, "hello"); 

正在成为

Log("Debug", "hello");

当 LuaInterface 为 C# 函数编组时。直到我创建了一个辅助工具ScriptLog(string level, string msg),我才能够在 lua 中正确使用该功能。我想保留能够在 Lua 中使用枚举名称的功能。

注意:由于 Lua 不支持枚举类型,tonumber(LogLevel.Debug)因此也会失败。

于 2014-04-02T20:58:39.237 回答
0

我以前从未使用过 Lua,但我在调用 COM 对象(或任何互操作)、目标程序集调用加载到不同的 App Domain 或任何其他与 .带有非.Net 的Net 程序集。

您是否尝试过在定义“chunks[chunkID]”和“GetChunkGridPosition(chunkID)”结果的类上使用 [Serializable] 属性?您的所有互操作类和类型在两个程序集之间是否兼容?

只是在这里大声思考。

于 2014-04-02T17:46:09.823 回答
0

旁注:您应该将代码减少到产生问题的最短示例。例如,我们不需要查看您的包装函数。您应该尝试删除它。如果这解决了问题,那是你应该提到的重要线索。如果问题仍然存在,那么对于阅读本文的人来说,该代码只是一个分散注意力的无关紧要的东西。

您的问题可能出在您的Log功能上。其他一切看起来都很好,这是我们实际上看不到的唯一代码,您的问题可以像这样重现:

public static void Log(int errorLevel, string message)
{
    Console.WriteLine(message);
}

public void Test()
{
    var lua = new Lua();
    lua.RegisterFunction("Log", this, GetType().GetMethod("Log"));
    lua.DoString("function foo() Log('a','b') end");
    lua.GetFunction("foo").Call();
}

在这种情况下,因为 'a' 不能编组为数字。

于 2014-04-02T19:41:45.357 回答