Распределить равномерно в 2D - PullRequest
0 голосов
/ 17 сентября 2018

Так что я пытаюсь распределить 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 элементов или меньше, и пробелов больше, чем я могу их распределить. Однако, если это неверно (более 4 изображений или менее 20 пикселей в пустом пространстве), я хочу создать вторую строку и переместить первую строку вверх (сейчас это точка 0 на оси Y).

Я много пробовал, но, похоже, не могу понять.

РЕДАКТИРОВАТЬ : Добавлено изображение того, что он делает в настоящее время.

1 Ответ

0 голосов
/ 21 сентября 2018

Вы должны использовать GridLayoutGroup вместе с префабом, содержащим компоненты LayoutElement и PageObjectBase.

Вы должны будете создать экземпляр префаба и сделать его дочерним по отношению к GameObject, который имеет компонент GridLayoutGroup.

Таким образом, вы можете установить желаемое изображение для каждого объекта путем доступа к PageObjectBase, а GridLayoutGroup позаботится о расположении изображений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...