public void ChangeState(PanelType targetType, bool addToStack = true) { if (isChangingState) { return; } if (targetType == currentType) { return; } if (addToStack) { panelStack.Push(currentType); } if (targetType == PanelType.HOMEPANEL) { panelStack.Clear(); } GUIPanel currentPanel = GetPanel(currentType); GUIPanel targetPanel = GetPanel(targetType); if (currentPanel != null && targetPanel != null && !targetPanel.isPopup || (currentPanel != null && currentPanel.isPopup)) { float waitTime = currentPanel.Hide(); if (waitTime != 0) { isChangingState = true; StartCoroutine(WaitForCurrentStateToHide(waitTime)); } } OnStateChangeEvent?.Invoke(currentType, targetType); previousType = currentType; currentType = targetType; if (!isChangingState) { OnCurrentStateHidden(); } }