Распределить равномерно в 2D
Поэтому я стараюсь равномерно распределять 2D-элементы по экрану. Прямо сейчас у меня это работает таким образом, что я выбираю все элементы, и он вычисляет размер холста, а затем вычисляет все ширины объектов вместе, чтобы увидеть, сколько пробелов у него есть. Затем я равномерно распределяю их с нужным количеством пробелов между объектами. Работает отлично. Тем не менее, как только я получаю более 4 предметов или у меня недостаточно пробелов (например, объекты слишком большие), я хочу создать вторую строку и переместить первую строку вверх.
Ниже мой код.
public static void DistEvenly(PageObjectBase pageObject)
{
//List for objects
List<PageObjectBase> objectList = new List<PageObjectBase>();
float combinedWidth = 0;
PageObjectGroup group = (PageObjectGroup) pageObject;
//Start position is the left side of workField
float leftStartPosition = -Config.DefaultWorkfieldSize.x / 2;
int objectCount =0;
//For every object add it to list and calculate width and add it to combinedWidth
foreach (PageObjectBase objectBase in group.Children)
{
objectList.Add(objectBase);
float imageWidth = objectBase.BoxCollider.size.x * objectBase.transform.localScale.x;
combinedWidth = combinedWidth + imageWidth;
}
//whiteSpace is the remaining white space on the screen
float whiteSpace = Config.DefaultWorkfieldSize.x - combinedWidth;
//For each object place it at left start position and calculate the space between each image.
foreach (PageObjectBase objectBase in group.Children)
{
if (whiteSpace > 20 && objectList.Count <= 4)
{
objectCount = objectList.Count + 1;
objectBase.Move(leftStartPosition + whiteSpace / objectCount + objectBase.GetBoundsSize().x / 2, 0);
Debug.Log("I should now distribute them evenly!");
leftStartPosition = GetRightEdge(objectBase);
}
}
}
}
Таким образом, как вы можете видеть, он получает количество изображений в списке, вычисляет оставшиеся пробелы и, если существует не более 4 элементов или меньше, и более 20 пикселей пробелов, чем я могу их распределить. Однако, если это неверно (более 4 изображений или менее 20 пикселей в пустом пространстве), я хочу создать вторую строку и переместить первую строку вверх (сейчас это точка 0 на оси Y).
Я много пытался, но я просто не могу понять это.
РЕДАКТИРОВАТЬ: Добавлено изображение того, что он в настоящее время делает.
1 ответ
Вы должны использовать GridLayoutGroup
вместе с сборным, который имеет LayoutElement
и PageObjectBase
компоненты.
Вы должны будете создать экземпляр префаба и сделать его дочерним объектом GameObject, который имеет GridLayoutGroup
составная часть.
Таким образом, вы можете установить желаемое изображение для каждого объекта, открыв PageObjectBase
и GridLayoutGroup
позаботится о макете изображений.