Unity 3D: группа вертикальных макетов не размещает элементы там, где они должны быть - PullRequest
0 голосов
/ 13 февраля 2020

У меня проблема с моими группами макетов и я не могу использовать свой интерфейс. У меня есть меню, которое содержит два пустых элемента: синие и зеленые прямоугольники ниже, которые заполняются во время игры в зависимости от того, что делает игрок. Оранжевые поля - это кнопки, которые могут добавлять или удалять как фиолетовые, так и оранжевые поля в зависимости от нажатой кнопки. Серые, синие и зеленые поля имеют группу вертикальной компоновки и установщик размера содержимого (для вертикальной подгонки установлено значение «Предпочитаемый размер»). Поэтому, насколько я понимаю, все дети в этих коробках должны быть сложены вертикально и будут расширяться и сжиматься по мере необходимости.

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

enter image description here

Если я вручную изменяю какие-либо атрибуты серого, синего или зеленого ящиков, например, привязку якоря, или масштабирую их, меняю их так, как должно быть.

Я что-то делаю что-то не так с установщиком вертикального макета / размера контента? Я надеюсь, что этого достаточно, чтобы включить go. Я могу предоставить код, если это будет необходимо. Я просто не знаю точно, чем поделиться.

Когда кнопка нажата, вызовите этот метод.

void AcceptUnlockButtonInput(Exit roomExit) {
    if (PlayerHasKeyForExit(roomExit)) {
        LogAction(roomExit.exitUnlockDescription);
        roomExit.attemptedToExit = false;
        roomExit.attemptedToUnlock = false;
    } else if (roomExit.attemptedToUnlock == false) {
        LogAction(roomExit.exitLockedDescription);
    }

    DisplayActionText();

    foreach(Transform child in inputContainer.transform) {
        Destroy(child.gameObject);
    }

    DisplayInputButtons();
    Canvas.ForceUpdateCanvases();
}

LogActrion() просто добавляет строку в список, а затем DisplayActionTest() считывает этот список и создает / добавляет gameObjects в контейнер.

public void DisplayActionText() {
    actionLog.ForEach(value => {
        var textObject = Instantiate(displayTextPrefab) as GameObject;
        var textMeshPro = textObject.GetComponentInChildren<TextMeshProUGUI>();
        textMeshPro.text = value;
        textObject.transform.SetParent(outputContainer.transform, false);
    });

    actionLog.Clear();
    Canvas.ForceUpdateCanvases();
}

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

public void DisplayInputButtons() {
    foreach (var exit in Exits) {
            var unlockButton = Instantiate(userActionButton) as GameObject;
            newButton.text = buttonText;
            newButton.transform.SetParent(buttonGroup.transform, false);
            unlockButton.onClick.AddListener(() => AcceptUnlockButtonInput(exit));
    }
}

Ответы [ 3 ]

1 голос
/ 13 февраля 2020

У меня были похожие проблемы, и я нашел, что это полезно: https://docs.unity3d.com/ScriptReference/Canvas.ForceUpdateCanvases.html

Иногда при создании экземпляров элементов в игровом объекте с вертикальной группой макетов элементы попадают только в их правильное положение после обновления холста.

1 голос
/ 13 февраля 2020

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

Можете ли вы попробовать: - Добавить / удалить ваш элемент - VerticalLayoutLement. spacing + = Random.Range (-1,1);

Чтобы убедиться, что он правильно масштабируется, я обычно делаю это в сопрограмме с "yield return new WaitForNewFrame ()" перед частью интервала.

0 голосов
/ 13 февраля 2020

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

Что-то, что сработало для меня, было:

LayoutRebuilder.ForceRebuildLayoutImmediate(recttransform of the layoutgroup);

Вы также можете попробовать отключить и включить компонент группы макетов:

IEnumerator UpdateLayoutGroup()
{
layoutGroupComponent.enabled = false;
yield return new WaitForEndOfFrame();
layoutGroupComponent.enabled = true;
}

Если включение и отключение компонента layoutgroup не работает, вы также можете попробовать это:

IEnumerator UpdateLayoutGroup()
{
yield return new WaitForEndOfFrame();

layoutGroupComponent.enabled = false;

layoutGroupComponent.CalculateLayoutInputVertical();

LayoutRebuilder.ForceRebuildLayoutImmediate(recttransform of the layoutgroup);

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