使用MoonSharp Lua访问结构体

我在通过Lua解释器MoonSharp来更改结构体成员的过程中遇到了问题。

我的测试环境如下所示:

class VectorClass
{
    public float X;
    public float Y;

    public Vector2(float X, float Y)
    {
        this.X = X;
        this.Y = Y;
    }
}

struct VectorStruct
{
    public float X;
    public float Y;

    public Vector2(float X, float Y)
    {
        this.X = X;
        this.Y = Y;
    }
}

测试时,我将向量对象作为类和结构传递。

[MoonSharpUserData]
class MyClass
{
    public VectorClass VClass;
    public VectorStruct VStruct;

    public MyClass()
    {
        VClass = new VectorClass(0,0);
        VStruct = new VectorStruct(0, 0);
    }
}

这是包含结构体/类的类。

class Program
{
    static void Main(string[] args)
    {
        Script script = new Script();
        MyClass classic = new MyClass();

        string scriptString = @"
                function changeVelocity()
                    MyClass.VStruct.X = 10
                    MyClass.VClass.X = 10
                end";

        UserData.RegisterAssembly();
        UserData.RegisterType<VectorClass>();
        UserData.RegisterType<VectorStruct>();

        script.Globals["MyClass"] = classic;
        script.DoString(scriptString);
        script.Call(script.Globals.Get("changeVelocity"));

        Console.WriteLine("Class: " + classic.VClass.X);
        Console.WriteLine("Struct: " + classic.VStruct.X);

        Console.ReadKey();
    }
}

在我的主程序中,我尝试更改结构体和类的值(仅限x),但仅适用于类。

我认为问题在于类是值类型而不是引用类型。 我正在使用一个强制使用结构体的API,这迫使我让结构体访问起作用,但我甚至不能使用MoonSharp ProxyType。

有没有人知道没有完全重写代码的解决方法?

点赞
用户7097952
用户7097952

是的,与类不同,结构体存储的是值,而不是引用,Moonsharp 对此不是真正好。一个简单的解决方法是让 Lua 函数 create 一个新值,甚至可以将其绑定到一个简单的 lambda 函数,就像这样:

string scriptString = @"
    function changeVelocity(MyClass)
        MyClass.VStruct = VStruct(10, MyClass.VStruct.Y)
        MyClass.VClass.X = 10
    end";

UserData.RegisterAssembly();
UserData.RegisterType<VectorClass>();
UserData.RegisterType<VectorStruct>();

script.Globals["VStruct"] = (Func<float, float, VectorStruct>)((x, y) =>
{ return new VectorStruct(x, y); });
script.DoString(scriptString);
script.Call(script.Globals.Get("changeVelocity"), classic);

在这里查看关于值类型的更多信息的词汇表中的最后一项: http://www.moonsharp.org/hardwire.html

2018-08-09 20:43:32