0

我创建了一个 XNA 应用程序,它利用 LuaInterface(通过 Lua)来控制应用程序本身的许多方面。

KeyboardState我向 XNA 类(特别是对象)添加了扩展。问题是,如果我用 Lua 调用扩展函数,我会得到一个错误: 尝试调用字段 'KeyDown' (a userdata value .

这是我的 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

我究竟做错了什么?

4

2 回答 2

3

扩展方法是编译器的功能,而不是框架。为了从 Lua 调用它,你需要直接调用你的 XNAExtensions 模块作为静态方法。Lua 不理解扩展方法。

XNAExtensions:KeyDown(Players.LocalPlayer.Controller.KeyboardState, KeyboardKey.W)
于 2012-08-01T00:05:59.343 回答
2

扩展方法不是类的实际扩展,就像子类化一样。这是 C# 和 VB 编译器在解析源文件时可以理解的东西,但编译后的字节码看起来仍然来自XNAExtensions.KeyDown(keyboardState, e)

要从您的 Lua 脚本中调用它,您必须从静态类访问该方法,而不是作为扩展方法。

于 2012-08-01T00:05:37.953 回答