我可以在实现自己的Vector2结构的多个库中使用相同的Vector2结构吗?

问题描述

我正在制作2D游戏,它将使用一个库将图形渲染到屏幕上,将另一个库用于物理。问题在于两个库都实现了自己的Vector2结构。这意味着我必须经常在两者之间进行转换,并且由于将它们都称为“ Vector2”,因此可能会混淆我所指的Vector2。理想情况下,我想在两个库中使用相同的Vector2类。如何使用C#实现呢?

解决方法

您可以编写自己的MyVector2结构来支持implicit conversion到其他Vector2类型。

struct MyVector2
{
    public float x;
    public float y;

    public static implicit operator GraphicsLib.Vector2(MyVector2 v)
    { return new GraphicsLib.Vector2(v.x,v.y); }

    public static implicit operator PhysicsLib.Vector2(MyVector2 v)
    { return new PhysicsLib.Vector2(v.x,v.y); }

    ...
}

然后MyVector2的实例应该与任何一个期望来自两个库的Vector2的函数兼容。

MyVector2 v = new MyVector2(5f,20f);
GraphicsLib.DoSomethingWithVector(v);
PhysicsLib.DoSomethingWithVector(v);

如果优化至关重要,则在转换运算符内部也可以使用使用System.Runtime.CompilerServices.Unsafe.As<MyVector2,PhysicsLib.Vector2>(ref v);提及的其他答案。

,

如果它们具有相同的内部布局,则可以使用System.Runtime.CompilerServices.Unsafe在它们之间进行转换。您也可以为每种类型创建扩展方法。例如。 public static Lib1.Vector2 ToLib1(this Lib2.Vector2 v) = > System.Runtime.CompilerServices.Unsafe.As<Lib2.Vector2,Lib1.Vector2>(ref v); 就我个人而言,我会在支持SIMD的所有地方都使用MonoGame,但会使用System.Numerics.Vector2(这可能是不必要的微优化,但我知道我会尽可能使用SIMD指令,因此我睡得更好。)