【问题标题】:How to call a Lua function from VB.NET using LuaInterface如何使用 LuaInterface 从 VB.NET 调用 Lua 函数
【发布时间】:2015-01-27 07:27:44
【问题描述】:

我一直试图弄清楚如何从“预编译”的 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,因为它被多次调用,并且 LoadFile over 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”来拉它,但我一直不知道如何获取Lua 被 C# 调用。

谢谢。

【问题讨论】:

    标签: vb.net lua


    【解决方案1】:

    我可以通过调用“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() 一次,并以这种方式获取函数。这里重要的是编码至少执行一次才能获取创建的函数。只加载它是行不通的。

    【讨论】:

    • LoadFile 从文件内容创建一个函数值。 DoFile 也执行该功能。如果文件包含函数定义,则在函数执行之前不会执行它们。在 Lua 中,函数是从函数定义表达式创建的值。必须评估表达式以创建函数值。像function x() end 这样的语法是x = function() end 的另一种形式。在这种形式中,您可以看到 RHS 是由函数定义组成的表达式。执行语句时,RHS 表达式创建函数值,并为其分配 x
    猜你喜欢
    • 1970-01-01
    • 2014-09-15
    • 1970-01-01
    • 2011-03-26
    • 2013-12-22
    • 2011-02-01
    • 2015-07-14
    • 2015-04-03
    • 2019-06-08
    相关资源
    最近更新 更多