如何使用LuaInterface从VB.NET调用Lua函数

我一直在尝试弄清楚如何从“预编译”的LuaFunction中调用Lua函数。 总体思路是我想从C#调用Lua函数。 我能够通过使用Lua.RegisterFunction()实现另一种方法,但这种方法无法使用'Lua.LoadFile()'读取或存在实际函数,导致回调返回null。不过,我还不确定如何设置。

所以,为了在VB.net中初始化Lua脚本,我使用了以下类:

Private state As Lua
Private luafunction As LuaFunction

Public Sub New(ByVal playerInstance As PlayerClass)
        Me.playerInstance = playerInstance
        state = New Lua()
        state.RegisterFunction("PrivateMessage", Me, Me.GetType().GetMethod("PrivateMessage"))
        state("playerID") = Me.playerInstance.Index
        luafunction = state.LoadFile(SkillsFolder & "script.lua")
End Sub

其中luafunction是预编译的脚本。 我想使用LoadFile是因为它会被调用多次,而LoadFile比DoFile更高效。

这是我的调用函数:

Public Function ProcessAttack() As Boolean
        Dim luaFunc As LuaFunction = state.GetFunction("AttackProcess")

        If luaFunc IsNot Nothing Then
            Dim processed As Object = luaFunc.Call()
            Return processed(0)
        End If
    Return False
End Function

很明显,luaFunc为空/无效。 然后,LUA脚本如下:

function AttackProcess()
   PrivateMessage(playerID, "Test!")
   return true
end

这是一个非常基本的脚本。 思路是当玩家“攻击”时,首先应调用Lua脚本以查看是否存在并可在Lua中处理该函数,否则C #将在其选择的默认方法中处理它。 (因此,如果处理,AttackProcess()将返回真(true),然后处理基本攻击的C#编码将不会被调用。)

我有一种感觉,Dim luaFunc As LuaFunction = state.GetFunction("AttackProcess") 已经在尝试搜索空,我可能需要使用预编译变量'luafunction'来提取它,但我一直被困扰如何从C#调用Lua。

谢谢。

点赞
用户3249223
用户3249223

我能够通过调用 'DoFile' 而不是 'LoadFile' 来解决这个问题。显然,在尝试将其拉入 LuaFunction 之前,函数本身需要被加载。

例如

如果 File.Exists(SkillsFolder & "Main\" & playerInstance.ClassName & ".lua") Then
    state.DoFile(SkillsFolder & "Main\" & playerInstance.ClassName & ".lua")
    Dim luaFunc As LuaFunction = state.GetFunction("attack")
    如果 luaFunc 不是 Nothing Then
        luaAttack = luaFunc
    结束 如果
结束 如果

现在可以正常工作,而 luaAttack 最终带有适当的函数。你还可以使用 LoadFile,然后调用()一次,以此方式抓取功能。这里重要的是,编码至少被执行一次,才能够抓取创建的函数。仅加载它不起作用。

2014-11-30 01:57:22