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();
        }
    }