В Unity пытается получить координаты Vector3 из массива и установить их в новую переменную. Какой правильный синтаксис?

Вы столкнулись с функцией столбцов с одинаковой высотой гибки.

Исходная настройка контейнера flex - align-items: stretch.

Это означает, что элементы гибки автоматически расширяют всю длину поперечной оси контейнера. В контейнере с вертикальным направлением поперечная ось вертикальна (высота).

Самый высокий элемент устанавливает высоту для всех братьев и сестер. Поскольку самый высокий предмет расширяется, его братья и сестры следуют за ним. Следовательно, равная высота для всех элементов.

Чтобы переопределить эту настройку по умолчанию, добавьте align-items: flex-start в контейнер flex:

#container_add_movies {
   display: flex;
   align-items: flex-start;
}

#container_add_movies {
  display: flex;
  align-items: flex-start;       /* NEW */
}

#container_add_movies #feedback {
  width: 20%;
  background-color: green;
  display: block;
}

#container_add_movies #search {
  width: 60%;
  background-color: red;
}

#container_add_movies #suggestions {
  width: 20%;
  background-color: yellow;
}
Feedback
Suggestions

... или align-self: flex-start к элементам flex:

#feedback {
    align-self: flex-start;
    width: 20%;
    background-color: green;
}

 #suggestions {
    align-self: flex-start; 
    width: 20%;
    background-color: yellow;
}

#container_add_movies {
  display: flex;
}

#container_add_movies #search {
  width: 60%;
  background-color: red;
}

#feedback {
  align-self: flex-start;  /* NEW */
  width: 20%;
  background-color: green;
}

#suggestions {
  align-self: flex-start;  /* NEW */
  width: 20%;
  background-color: yellow;
}
Feedback
Suggestions

align-items устанавливает значение по умолчанию align-self. С помощью align-self вы можете переопределить значение по умолчанию для отдельных элементов.

Подробнее в спецификации:

8.3. Выравнивание по оси: свойства align-items и align-self

Элементы Flex могут быть выровнены по поперечной оси текущей линии контейнера flex, аналогично justify-content, но в в перпендикулярном направлении.

align-items устанавливает выравнивание по умолчанию для всех элементов гибкого контейнера, включая анонимные элементы гибкости.

align-self позволяет переопределить это выравнивание по умолчанию для отдельных flex.

blockquote>

Немного истории

С самого начала CSS существовали две задачи компоновки, которые регулярно расстраивались, озадачивались и раздражали фронт -end разработчиков:

  1. Как центрировать вещи, особенно вертикально, и
  2. Как создать столбцы с одинаковой высотой (таблицы в сторону)

Сегодня, с появлением flexbox, эти проблемы закончены.

Центрирование вещей никогда не было проще:

#container {
    display: flex;
    justify-content: center;    /* center flex items along the main axis */
    align-items: center;        /* center flex items along the cross axis */
}

Простой. Легко. Эффективное. Сумасшествие закончилось .

В терминах столбцов с одинаковой высотой, flexbox также превосходит: он делает это по умолчанию.

#container {
    display: flex;
    flex-direction: row;        /* not even necessary; default rule */
    align-items: stretch;       /* not even necessary; default rule */
}

align-items: stretch правило говорит, что элементы гибкости должны максимально расширяться вдоль поперечной оси. Следовательно, в контейнере со строкой все элементы могут быть равны по высоте. Больше сумасшествия, прирученного flexbox .

Из одного популярного ответа для столбцов с одинаковой высотой :

Дайте overflow: hidden к контейнеру и большому (и равному) отрицательному маржу и положительному отступу к столбцам. Обратите внимание, что этот метод имеет некоторые проблемы, например.

blockquote>

Теперь это хак!

Маятник теперь начинает качать в другую сторону: Дизайнеры спрашивают как отключить столбцы с одинаковой высотой.

0
задан toshiro92 29 March 2019 в 14:15
поделиться

4 ответа

Вы должны инициализировать массив roadCoordinates, иначе вы получите ошибку NullReferenceException. Кроме этого ваша логика в порядке. Вы можете решить эту проблему, добавив эту строку после loopCount назначения:

roadCoordinates = new Vector3[loopCount];

Что происходит, когда вы не инициализируете свой массив, вы создаете переменную с именем roadCoordinates, но есть нет памяти, выделенной или указанной для этой переменной. Поэтому он не указывает на что-либо в памяти, и когда вы пытаетесь использовать его, он говорит, что я не могу сослаться ни на один блок памяти.

Как вы упомянули в своем вопросе, что у вас есть список всех порожденных объектов, вы также можете сохранять эти точки в списке, тогда вам не нужно выделять какую-либо память, вы можете просто добавить элементы в список.

List<Vector3> roadCoordinates = new List<Vector3>()

Затем вы можете добавить элементы, используя roadCoordinates.Add(spawnedObjects[i].transform.position)

Если вам нужно сохранить индексы порожденного объекта, который имеет Road Tag, вы можете использовать Dictionary

Dictionary<int, Vector3> roadCoordinates = new Dictionary<int, Vector3>()

Затем вы можете добавить такие элементы, как roadCoordinates.Add(i,spawnedObject[i].transform.position)

0
ответ дан Ali Kanat 29 March 2019 в 14:15
поделиться

Да, как предполагает Александр, использование списков - это путь. Вам не нужно использовать словарь, так как вы уже знаете, что список roadCoordinates будет содержать только элементы тега 'Road Tag'.

public static List<Vector3> roadCoordinates = new List<Vector3>();

public static void FindSpawnedRoads()
{
    loopCount = spawnedObjects.Count;

    for (int i = 0; i < loopCount; i++)
    {
        if (spawnedObjects[i].tag == "Road Tag")
        {
            roadCoordinates.Add(new Vector3(spawnedObjects[i].transform.position.x, spawnedObjects[i].transform.position.y, spawnedObjects[i].transform.position.z));
        }

    }
}
0
ответ дан v0xnihili 29 March 2019 в 14:15
поделиться

Использование списков лучше в этом случае, потому что мы не знаем с самого начала, сколько объектов у нас будет.

List<Vector3> roadCoordinates = new List<Vector3>();

...

roadCoordinates.Add(new Vector3(...));

Здесь учебник о списках.

0
ответ дан KT12 29 March 2019 в 14:15
поделиться

Вы, вероятно, должны использовать array.push () (см .: https://docs.unity3d.com/ScriptReference/Array.Push.html ) вместо написания 'roadCoordinates [i]', как этот массив все еще пуст. Используя 'push', вы добавляете новый вектор положения / 3D в конец массива, который также работает, если массив все еще пуст. Я надеюсь, что это поможет вам!

PS: если вы сначала инициализируете массив определенной длины, как это было предложено в другом ответе, у вас будет много пустых элементов массива, поскольку не каждый элемент в вашем цикле является «дорожной меткой».

0
ответ дан v0xnihili 29 March 2019 в 14:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: