Распределить равномерно в 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 позаботится о макете изображений.

Другие вопросы по тегам