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

Can I use the same Vector2 struct across multiple librarys that implement their own Vector2 structs?

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

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

您可以编写自己的 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); 的另一个答案也可以在转换运算符内部使用。