unity3d 如何在Unity中扩展/修改向量类型结构体的行为以实现位置环绕?

bvpmtnay  于 2023-01-31  发布在  其他
关注(0)|答案(1)|浏览(145)

我正在创建一个基于网格的游戏,使用Vector2Ints来表示网格上的位置。世界需要在x轴和y轴上包裹,这意味着如果世界是100x100个单元大小,那么对于position = new Vector2Int(99, 99)displacement = new Vector2Int(1,1)的实体,我们会得到newPosition = position + displacement等于Vector2Int(0, 0)。最明显的方法最初似乎覆盖了Unity中Vector2Int结构体的set方法行为,因为这样我就可以继续受益于结构体上的所有其他方法,如加法、整数乘法等,同时仍然获得每个操作的“ Package ”功能。这是关键,所以我不必记住不断调用帮助函数。
我认为实现这一点的方法是以某种方式扩展Vector2Int,这样我就可以设置mapWidthmapHeight,并将set方法修改为x = xIn % mapWidthy = yIn % mapHeight
我希望得到一些建议,说明如何在不复制整个Vector2Int结构体的代码(尽管有一些小的修改)的情况下最好地实现上述目标。

e4yzc0pl

e4yzc0pl1#

你可以像这样给任何类添加一个扩展方法:

// the class name here doesn't matter. Just some static class.
public static class Helpers
{
    public static Vector2Int Wrapped(this Vector2Int v, int wrapX, int wrapY)
    {
        return new Vector2Int(v.x % wrapX, v.y % wrapY);
    }
}

用法:

Vector2Int vec = new Vector2Int(15,15);
Vector2Int vecWrapped = vec.Wrapped(10, 10);

vecWrapped现在将为5,5。
正是方法参数中的"this Vector2Int"使它扩展了类。
编辑:关于是否可以覆盖Set方法的问题,不是直接的。你可以添加一个名为Set的扩展方法,但是它不能有相同的签名,也就是说,它不能是Set(x,y)。你可以添加一个名为别的方法。
而且,在对向量进行任何操作后,没有办法让它自动"网格化"。
正如aybe所建议的那样,使用"this ref"可以使它更有用,从而消除了对返回值赋值的需要。

public static class Helpers
{
    public static int gridX = 10;
    public static int gridY = 10;

    public static void SetGrid(this ref Vector2Int v, int x, int y)
    {
        v.Set(x % gridX, y % gridY);
    }
}

用法:

Vector2Int v = Vector2Int.zero;
v.SetGrid(15, 15);

v现在将是5,5。

相关问题