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

时间:2014-11-28 15:43:04

标签: vb.net lua

我一直试图弄清楚如何从'预编译'的LuaFunction调用Lua函数。一般的想法是我想从C#调用Lua函数。我可以通过使用Lua.RegisterFunction()来反过来做到这一点。但是很好。

最终发生的是回调返回null,即使用'Lua.LoadFile()'时,实际的函数似乎不会被读取或存在。我还不确定如何设置它。

因此,为了在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,因为它被调用多次,而DoFile上的LoadFile效率更高。

我在这里有调用函数:

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没有/ null。实际上并没有在这里工作。 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。

谢谢。

1 个答案:

答案 0 :(得分:0)

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

例如

If File.Exists(SkillsFolder & "Main\" & playerInstance.ClassName & ".lua") Then
    state.DoFile(SkillsFolder & "Main\" & playerInstance.ClassName & ".lua")
    Dim luaFunc As LuaFunction = state.GetFunction("attack")
    If luaFunc IsNot Nothing Then
        luaAttack = luaFunc
    End If
End If

现在有效,而luaAttack最终会有正确的功能。你也可以使用LoadFile,然后使用Call()一次,并以这种方式获取函数。这里重要的是编码至少执行ONCE以便能够获取创建的函数。加载它只是行不通。