Вы столкнулись с функцией столбцов с одинаковой высотой гибки.
Исходная настройка контейнера 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
Search
Search
Search
Search
Search
Search
Search
Search
Search
Search
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
Search
Search
Search
Search
Search
Search
Search
Search
Search
Search
Suggestions
align-items
устанавливает значение по умолчанию align-self
. С помощью align-self
вы можете переопределить значение по умолчанию для отдельных элементов.
Подробнее в спецификации:
8.3. Выравнивание по оси: свойства
align-items
иalign-self
Элементы Flex могут быть выровнены по поперечной оси текущей линии контейнера flex, аналогично
justify-content
, но в в перпендикулярном направлении.
align-items
устанавливает выравнивание по умолчанию для всех элементов гибкого контейнера, включая анонимные элементы гибкости.blockquote>
align-self
позволяет переопределить это выравнивание по умолчанию для отдельных flex.Немного истории
С самого начала CSS существовали две задачи компоновки, которые регулярно расстраивались, озадачивались и раздражали фронт -end разработчиков:
- Как центрировать вещи, особенно вертикально, и
- Как создать столбцы с одинаковой высотой (таблицы в сторону)
Сегодня, с появлением 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 .Из одного популярного ответа для столбцов с одинаковой высотой :
Дайте
blockquote>overflow: hidden
к контейнеру и большому (и равному) отрицательному маржу и положительному отступу к столбцам. Обратите внимание, что этот метод имеет некоторые проблемы, например.Теперь это хак!
Маятник теперь начинает качать в другую сторону: Дизайнеры спрашивают как отключить столбцы с одинаковой высотой.
Вы должны инициализировать массив 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)
Да, как предполагает Александр, использование списков - это путь. Вам не нужно использовать словарь, так как вы уже знаете, что список 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));
}
}
}
Использование списков лучше в этом случае, потому что мы не знаем с самого начала, сколько объектов у нас будет.
List<Vector3> roadCoordinates = new List<Vector3>();
...
roadCoordinates.Add(new Vector3(...));
Здесь учебник о списках.
Вы, вероятно, должны использовать array.push () (см .: https://docs.unity3d.com/ScriptReference/Array.Push.html ) вместо написания 'roadCoordinates [i]', как этот массив все еще пуст. Используя 'push', вы добавляете новый вектор положения / 3D в конец массива, который также работает, если массив все еще пуст. Я надеюсь, что это поможет вам!
PS: если вы сначала инициализируете массив определенной длины, как это было предложено в другом ответе, у вас будет много пустых элементов массива, поскольку не каждый элемент в вашем цикле является «дорожной меткой».