【问题标题】:Accessing a struct using MoonSharp Lua使用 MoonSharp Lua 访问结构
【发布时间】:2016-11-13 18:52:00
【问题描述】:

我在更改结构成员时遇到问题,该结构是通过 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。

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

【问题讨论】:

    标签: c# struct lua moonsharp


    【解决方案1】:

    是的,不像类结构存储值,而不是引用,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-06-16
      • 2017-07-21
      • 1970-01-01
      • 2014-12-01
      • 2017-03-15
      • 2016-09-10
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      相关资源
      最近更新 更多