我在更改结构的成员时遇到问题,通过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);
}
}
这是包含struct / class的类。
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),但它只适用于类。
我认为该类是Value-Type而不是Reference类型存在一些问题。 我正在使用的API使用结构,这迫使我使结构访问工作,但我甚至不能使用MoonSharp ProxyType。
有没有人知道解决方法而不完全重写代码?
答案 0 :(得分:1)
是的,与类结构存储值而不是引用存储的不同,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