使用 MoonSharp Lua 访问结构

本文关键字:结构 访问 Lua MoonSharp 使用 | 更新日期: 2023-09-27 17:56:18

我在通过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。

有谁知道在不完全重写代码的情况下的解决方法?

使用 MoonSharp Lua 访问结构

是的,与类结构存储值而不是引用不同,Moonsharp 在这方面并不擅长。一个简单的解决方法可能是让Lua函数创建一个新值,您甚至可以将其绑定到一个简单的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