【发布时间】:2020-05-28 18:52:41
【问题描述】:
我的布局组和保持 UI 一致时遇到问题。我有一个菜单,其中包含两个空元素蓝色和绿色框,它们会在播放时根据玩家的行为填充。橙色框是可以添加或删除紫色框或橙色框的按钮,具体取决于按下的按钮。灰色、蓝色和绿色框都具有垂直布局组和内容大小调整器(垂直适合设置为“首选大小”)。因此,据我了解,这些盒子中的所有孩子都应该垂直堆叠,并根据需要扩展和收缩盒子。
我遇到的问题是,当我第一次按下添加紫色框并展开蓝色框的按钮时,绿色框保持在原来的位置。我第二次按下按钮时,无论将什么添加到蓝色框中,绿色框都会移动到它应该在的位置。相反,如果第一次按下按钮会移除紫色框并缩小蓝色框,则绿色框会保持在原位,直到我再次按下按钮然后移动到它应该在的位置。
如果我手动更改任何灰色、蓝色或绿色框属性,例如锚点枢轴或缩放框,它们会按照应有的方式重新排列。
我在垂直布局/内容大小调整器方面做错了吗?我希望这足以继续下去。如果需要,我可以提供代码。我只是不知道具体要分享什么。
当按钮被按下时调用此方法。
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() 读取该列表并将游戏对象创建/添加到容器中。
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));
}
}
【问题讨论】:
标签: c# unity3d user-interface