Почему мы используем ключевое слово «new» при инициализации Vector3, а не целое число? - PullRequest
0 голосов
/ 09 января 2019

Почему тогда, если бы я инициализировал строку или целое число, я мог бы просто сделать это:

int number = 1;
string word = "word";

Но если я хочу инициализировать Vector3, я должен сделать:

Vector3 coordinate = new Vector3(1f,1f,1f);

Суть в том, что я создавал довольно большой массив и должен был выписывать новый Vector3 ... каждый раз, и это становилось довольно утомительным:

Vector3[,] coordsList = new Vector3[11, 11]
{
    {new Vector3(-1.32f,1.32f), new Vector3(-1.08f,1.32f), new Vector3(-0.84f,1.32f), new Vector3(-0.6f,1.32f), new Vector3(-0.36f,1.32f), new Vector3(-0.12f,1.32f), new Vector3(0.12f,1.32f), new Vector3(0.36f,1.32f), new Vector3(0.6f,1.32f), new Vector3(0.84f,1.32f), new Vector3(1.08f,1.32f) },
    {new Vector3(-1.32f,1.08f), new Vector3(-1.08f,1.08f), new Vector3(-0.84f,1.08f), new Vector3(-0.6f,1.08f), new Vector3(-0.36f,1.08f), new Vector3(-0.12f,1.08f), new Vector3(0.12f,1.08f), new Vector3(0.36f,1.08f), new Vector3(0.6f,1.08f), new Vector3(0.84f,1.08f), new Vector3(1.08f,1.08f) },
    {new Vector3(-1.32f,0.84f), new Vector3(-1.08f,0.84f), new Vector3(-0.84f,0.84f), new Vector3(-0.6f,0.84f), new Vector3(-0.36f,0.84f), new Vector3(-0.12f,0.84f), new Vector3(0.12f,0.84f), new Vector3(0.36f,1.32f), new Vector3(0.6f,0.84f), new Vector3(0.84f,0.84f), new Vector3(1.08f,0.84f) },
    {new Vector3(-1.32f,0.60f), new Vector3(-1.08f,0.60f), new Vector3(-0.84f,0.60f), new Vector3(-0.6f,0.60f), new Vector3(-0.36f,0.60f), new Vector3(-0.12f,0.60f), new Vector3(0.12f,0.60f), new Vector3(0.36f,0.60f), new Vector3(0.6f,0.60f), new Vector3(0.84f,0.60f), new Vector3(1.08f,0.60f) },
    {new Vector3(-1.32f,0.36f), new Vector3(-1.08f,0.36f), new Vector3(-0.84f,0.36f), new Vector3(-0.6f,0.36f), new Vector3(-0.36f,0.36f), new Vector3(-0.12f,0.36f), new Vector3(0.12f,0.36f), new Vector3(0.36f,0.36f), new Vector3(0.6f,0.36f), new Vector3(0.84f,0.36f), new Vector3(1.08f,0.36f) },
    {new Vector3(-1.32f,0.12f), new Vector3(-1.08f,0.12f), new Vector3(-0.84f,0.12f), new Vector3(-0.6f,0.12f), new Vector3(-0.36f,0.12f), new Vector3(-0.12f,0.12f), new Vector3(0.12f,0.12f), new Vector3(0.36f,0.12f), new Vector3(0.6f,0.12f), new Vector3(0.84f,0.12f), new Vector3(1.08f,0.12f) },
    {new Vector3(-1.32f,-0.12f), new Vector3(-1.08f,-0.12f), new Vector3(-0.84f,-0.12f), new Vector3(-0.6f,-0.12f), new Vector3(-0.36f,-0.12f), new Vector3(-0.12f,-0.12f), new Vector3(0.12f,1.32f), new Vector3(0.36f,-0.12f), new Vector3(0.6f,-0.12f), new Vector3(0.84f,-0.12f), new Vector3(1.08f,-0.12f) },
    {new Vector3(-1.32f,-0.36f), new Vector3(-1.08f,-0.36f), new Vector3(-0.84f,-0.36f), new Vector3(-0.6f,-0.36f), new Vector3(-0.36f,-0.36f), new Vector3(-0.12f,-0.36f), new Vector3(0.12f,-0.36f), new Vector3(0.36f,-0.36f), new Vector3(0.6f,-0.36f), new Vector3(0.84f,-0.36f), new Vector3(1.08f,-0.36f) },
    {new Vector3(-1.32f,-0.6f), new Vector3(-1.08f,-0.6f), new Vector3(-0.84f,-0.6f), new Vector3(-0.6f,-0.6f), new Vector3(-0.36f,-0.6f), new Vector3(-0.12f,-0.6f), new Vector3(0.12f,-0.6f), new Vector3(0.36f,-0.6f), new Vector3(0.6f,-0.6f), new Vector3(0.84f,-0.6f), new Vector3(1.08f,-0.6f) },
    {new Vector3(-1.32f,-0.84f), new Vector3(-1.08f,-0.84f), new Vector3(-0.84f,-0.84f), new Vector3(-0.6f,-0.84f), new Vector3(-0.36f,-0.84f), new Vector3(-0.12f,-0.84f), new Vector3(0.12f,-0.84f), new Vector3(0.36f,-0.84f), new Vector3(0.6f,-0.84f), new Vector3(0.84f,-0.84f), new Vector3(1.08f,-0.84f) },
    {new Vector3(-1.32f,-1.08f), new Vector3(-1.08f,-1.08f), new Vector3(-0.84f,-1.08f), new Vector3(-0.6f,-1.08f), new Vector3(-0.36f,-1.08f), new Vector3(-0.12f,-1.08f), new Vector3(0.12f,-1.08f), new Vector3(0.36f,-1.08f), new Vector3(0.6f,-1.08f), new Vector3(0.84f,-1.08f), new Vector3(1.08f,-1.08f) },
};

Но все же было бы значительно проще, если бы это был массив целых чисел? Что такое в Vector3, для которого требуется это ключевое слово new, которого нет у целого числа или строки?

Ответы [ 4 ]

0 голосов
/ 10 января 2019

Ваши координаты представляют собой сетку с зеркальным отражением, что означает, что у вас есть только около 6 уникальных значений. Однако, чтобы упростить ситуацию, мы будем отслеживать и отрицательные.

float[] values = new float[] { 
    1.32f,  1.08f,  0.84f,  0.6f,  0.36f,  0.12f, 
   -0.12f, -0.36f, -0.6f, -0.84f, -1.08f, -1.32f };

Теперь используйте вложенный цикл for для заполнения вашего массива координат:

Vector3[,] coordsList = new Vector3[11,11];

void Init() { 

    for ( int x = 0; x < coordsList.GetLength(0); x++) {
        for ( int y = 0; y < coordsList.GetLength(1); y++ ) {
            coordsList[x, y] = new Vector3(-values[x], values[y]);
        }
    }
}

Если вы хотите сохранить разрозненные координаты (т. Е. Не привязанные к сетке), то есть другие способы формирования входных данных, но преобразование в Vector3 не будет сильно меняться.

0 голосов
/ 10 января 2019
Vector3[][] list = new (float x, float y)[][]
{
    new[] { (1.5f, 3.4f), (1.5f, 6.8f) },
    new[] { (1.5f, 3.4f), (1.5f, 6.8f) },
    new[] { (1.5f, 3.4f), (1.5f, 6.8f) },
    new[] { (1.5f, 3.4f), (1.5f, 6.8f) },
}.Select(r => r.Select(v => new Vector3(v.x, v.y)).ToArray()).ToArray();

Вы можете использовать Value Tuples (теперь поддерживается в последней версии Unity 2018.3) для построения ваших данных читабельным и менее утомительным способом - тогда вы можете использовать Выбрать для преобразования это в Vector3s.

Я думаю, что большинство комментариев адекватно охватывают ваши вопросы о том, как и почему новое ключевое слово здесь.

0 голосов
/ 10 января 2019

Причина, по которой Vector3 требует ключевое слово new, заключается в том, что Vector3 является структурой, встроенной в Unity, поэтому каждый раз, когда вы используете ключевое слово new, вы создаете новый экземпляр * 1005. * struct, тогда как для string или int эти основные типы данных взяты из C #.

Надеюсь, это поможет объяснить разницу!

0 голосов
/ 10 января 2019

На основании последних комментариев я хотел бы предложить это решение (с помощью метода расширения).

var list  = new (float X, float Y, float Z)[2, 2]
{
    {(-1.32f, 0f, 1.32f), (-1.32f, 0f, 1.32f)},
    {(-1.32f, 0f, 1.32f), (-1.32f, 0f, 1.32f)}
};

Vector3[,] coordsList = list.ToVector3();

и тогда вы можете использовать метод Extension ...

public static class Vector3Extensions
{
    public static Vector3[,] ToVector3(this (float X, float Y, float Z)[,] value)
    {
        int columnCount = value.GetUpperBound(0);
        int rowCount = value.GetLength(0);

        var result = new Vector3[rowCount, columnCount];
        for (int i = 0; i < rowCount; i++)
        {
            for (int j = 0; j < columnCount; j++)
            {
                var tuple = ((float X, float Y, float Z))value.GetValue(i, j);
                result[i, j] = tuple.ToVector3();
            }
        }

        return result;
    }

    public static Vector3 ToVector3(this (float X, float Y, float Z) value)
    {
        return new Vector3(value.X, value.Y, value.Z);
    }
}

Конечно, оригинальное решение было бы более эффективным, но я не знал, что в то время вы использовали структуру из Unity. Однако это решение все еще пытается решить ту же проблему читабельности и повторяемости кода.


Оригинальный пост

Я предполагаю, что целью вашего вопроса является улучшение читабельности и рефакторинг повторяющегося кода. Вы можете использовать кортежи вместе с неявными операторами , чтобы сделать его немного больше того, что вы хотите ....

public class Vector3
{
    public Vector3(float x, float y)
    {
        this.X = x;
        this.Y = y;
    }

    public float X { get; set; }
    public float Y { get; set; }

    public static implicit operator (float X, float Y)(Vector3 value)
    {
        return (value.X, value.Y);
    }

    public static implicit operator Vector3 ((float X, float Y) value)
    {
        return new Vector3(value.X, value.Y);
    }
}

тогда вы можете построить это так ...

Vector3[,] coordsList  = new Vector3[2, 2]
{
    {(-1.32f,1.32f), (-1.32f,1.32f)},
    {(-1.32f,1.32f), (-1.32f,1.32f)}
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...