У меня проблема с моими группами макетов и я не могу использовать свой интерфейс. У меня есть меню, которое содержит два пустых элемента: синие и зеленые прямоугольники ниже, которые заполняются во время игры в зависимости от того, что делает игрок. Оранжевые поля - это кнопки, которые могут добавлять или удалять как фиолетовые, так и оранжевые поля в зависимости от нажатой кнопки. Серые, синие и зеленые поля имеют группу вертикальной компоновки и установщик размера содержимого (для вертикальной подгонки установлено значение «Предпочитаемый размер»). Поэтому, насколько я понимаю, все дети в этих коробках должны быть сложены вертикально и будут расширяться и сжиматься по мере необходимости.
Проблема, с которой я сталкиваюсь, заключается в том, что при первом нажатии кнопки, которая добавляет фиолетовую рамку и расширяет синюю рамку, зеленая коробка остается там, где она есть. Во второй раз, когда я нажимаю кнопку, зеленое поле сдвигается туда, где должно быть, независимо от того, что добавляется в синее поле. И наоборот, если нажатие кнопки в первый раз удаляет фиолетовые поля и сокращает синее поле, зеленое поле остается там, где оно есть, пока я снова не нажму кнопку, а затем сдвинется туда, где и должно быть.
Если я вручную изменяю какие-либо атрибуты серого, синего или зеленого ящиков, например, привязку якоря, или масштабирую их, меняю их так, как должно быть.
Я что-то делаю что-то не так с установщиком вертикального макета / размера контента? Я надеюсь, что этого достаточно, чтобы включить 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));
}
}