在Unity中,我能否向Vector3添加扩展方法?

3

当我想要在Unity中改变一个变换的位置时,通常会按照以下步骤进行:

var x = 10f;
transform.position = new Vector3(x, transform.position.y, transform.position.z);

但我认为这有点繁琐。因此,我在 Vector3 类中添加了此扩展方法。

public static class Vector3Extensions
{
    public static void SetX(this Vector3 pos, float x)
    {
        pos = new Vector3(x, pos.y, pos.z);
    }
    ....

当我调用时,没有错误,但实际上值没有改变。是的,我知道这可能是因为Vector3是结构体。我尝试向我的方法添加ref关键字,

    public static void SetX(ref this Vector3 pos, float x)
    {
        pos = new Vector3(x, pos.y, pos.z);
    }

但是它不起作用,因为出现了“属性或索引器不能作为 out 或 ref 参数传递”的错误。 我想要的效果就像这样:

transform.position.SetX(10f);

有什么方法吗?谢谢。
1个回答

5

试试这个:

public static class Vector3Extensions
{
    public static Vector3 SetX(this Vector3 pos, float x)
    {
        return new Vector3(x, pos.y, pos.z);
    }
}

使用方法如下:

Vector3 v = new Vector3(1, 2, 3);

v = v.SetX(4);

或者,对于变换,可以像这样:
transform.position = transform.position.SetX(4);

编辑:

正如D. Stanley所指出的,你可以通过扩展Transform类来实现以下内容:

public static class TransformExtensions
{
    public static void SetXPos(this Transform t, float x)
    {
        t.position = t.position.SetX(x);
    }
}

可以这样调用:

transform.SetXPos(4);

1
+1 这里的关键是您必须重新设置“position”属性。无法就地更改不可变属性值。 - D Stanley
1
谢谢您的快速回复,对我非常有帮助。我决定像您展示的那样使用 transform.SetXPos() 方法。谢谢。 - Shintaro Nomiya
很高兴能够帮助。我希望你会将我的回答标记为正确。干杯! - Stevens Miller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接