我创建了一个XNA应用程序,它利用LuaInterface(通过Lua)来控制应用程序本身的许多方面。
我添加了一个XNA类的扩展(特别是KeyboardState
对象)。问题是,如果我用Lua调用扩展函数,我会收到一个错误: 尝试调用字段'KeyDown'(用户数据值 。
这是我的Lua脚本:
Game.Updated:Add(function(t)
if Players.LocalPlayer.Controller.KeyboardState:KeyDown(KeyboardKey.W) then
print("W key down")
end
end)
这是扩展课程的模块:
Imports System.Runtime.CompilerServices
Module XNAExtensions
<Extension()> _
Public Function KeyDown(ByVal this As Microsoft.Xna.Framework.Input.KeyboardState, ByVal e As Integer) As Boolean
Return this.IsKeyDown(e)
End Function
End Module
我做错了什么?
答案 0 :(得分:3)
扩展方法是编译器的功能,而不是框架。为了从Lua调用它,您需要直接将XNAExtensions模块作为静态方法调用。 Lua不了解扩展方法。
XNAExtensions:KeyDown(Players.LocalPlayer.Controller.KeyboardState, KeyboardKey.W)
答案 1 :(得分:2)
扩展方法不是类的实际扩展,就像子类化一样。在解析源文件时,C#和VB编译器可以理解这一点,但编译的字节码看起来仍然来自XNAExtensions.KeyDown(keyboardState, e)
要从Lua脚本中调用它,您必须从静态类而不是扩展方法访问该方法。