我一直试图弄清楚如何从'预编译'的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。
谢谢。
答案 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以便能够获取创建的函数。加载它只是行不通。