Не могу ли я добавить метод расширения для Vector3 в Unity? - PullRequest
3 голосов
/ 10 марта 2020

Когда я хочу изменить положение преобразования в 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 является struct. Я попытался добавить ключевое слово 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 Ответ

4 голосов
/ 10 марта 2020

Попробуйте:

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);

РЕДАКТИРОВАТЬ:

По мнению Д. Стэнли, вы можете расширить класс Transform следующим образом:

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

И назвать его так:

transform.SetXPos(4);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...