/// <summary>
        /// Shows specified screen ( Use Show("MyScreenName"); instead )
        /// </summary>
        /// <param name="screen"></param>
        public BaseScreen ShowScreen(BaseScreen screen, bool force = false)
        {
            if (screen == null)
            {
                throw new KeyNotFoundException("ScreenManager: Show(BaseScreen) failed, screen is Null.");
            }

            Debug("SHOW:" + screen.name);

            //Force screen open or wait until screens are properly removed and added
            if (!force && (screenQueueDirty || screenQueue.LastOrDefault() == screen))
            {
                return(screen);
            }

            screenQueue.Add(screen);
            InsertionSort(screenQueue);

            // Is screen a higher priority and should be show this instead of current one?
            if (Current == null || (int)Current.layerPriority <= (int)screen.layerPriority)
            {
                if (Current != null)
                {
                    Current.OnDeactivated(false);
                }
                screenQueueDirty = true;
            }

            return(screen);
        }
        IEnumerator CoroutineUpdate()
        {
            var waitTime = new WaitForSeconds(0.1f);

            while (true)
            {
                if (screenQueueDirty)
                {
                    if (screenToKill != null && screenToKill == Current)
                    {
                        Debug("KILL: " + screenToKill);
                        if (onScreenHide != null)
                        {
                            onScreenHide.Invoke(Current);
                        }

                        if (screenQueue.Contains(screenToKill))
                        {
                            screenQueue.Remove(screenToKill);
                        }

                        EventSystem.current.SetSelectedGameObject(null);
                        screenToKill.selectedObject = null;
                        screenToKill.OnDeactivated(true, true);
                        if (screenToKill.keepOnTopWhenHiding)
                        {
                            screenToKeepOnTop = screenToKill;
                        }
                        screenToKill = null;
                        Current      = null;

                        if (screenToShowInTheEnd != null)
                        {
                            screenQueue.Add(screenToShowInTheEnd);
                            screenToShowInTheEnd = null;
                        }
                    }

                    BaseScreen maxPriorityScreen = screenQueue.LastOrDefault();

                    // Is highest-score screen different from current shown one? Then show highest-score screen and hide current
                    if (Current != maxPriorityScreen)
                    {
                        Debug("Different? " + Current + " != " + maxPriorityScreen);

                        BaseScreen previousScreen = Current;

                        if (previousScreen != null)
                        {
                            previousScreen.selectedObject = EventSystem.current.currentSelectedGameObject;
                            EventSystem.current.SetSelectedGameObject(null);
                        }

                        if (maxPriorityScreen.Transition)   // Wait for transition
                        {
                            Debug("Transition is busy?");
                            Current          = null;
                            screenQueueDirty = true;
                            yield return(waitTime);

                            continue;
                        }
                        else
                        {
                            Current = maxPriorityScreen;

                            if (Current == null && defaultScreen != null)
                            {
                                Current = defaultScreen;
                            }

                            if (Current != null)
                            {
                                if (onScreenShow != null)
                                {
                                    onScreenShow.Invoke(Current);
                                }
                                Current.OnActivated();
                            }

                            if (previousScreen != null)
                            {
                                previousScreen.OnDeactivated(Current.hideCurrent);
                            }
                            else if (Current.hideCurrent && screenQueue.Count > 1)
                            {
                                for (int i = screenQueue.Count - 2; i >= 0; i--)
                                {
                                    screenQueue[i].OnDeactivated(true);
                                }
                            }

                            if (screenToKeepOnTop != null && screenToKeepOnTop.isActiveAndEnabled)
                            {
                                screenToKeepOnTop.transform.SetAsLastSibling();
                                screenToKeepOnTop = null;
                            }
                        }
                    }

                    screenQueueDirty = false;
                }

                // Make sure we're always selecting something when always-on is enabled
                if (alwaysOnSelection)
                {
                    if (Current != null && !Current.Transition)
                    {
                        GameObject selectedGameObject = EventSystem.current.currentSelectedGameObject;
                        bool       isCurrentActive    = (selectedGameObject != null && selectedGameObject.activeInHierarchy);

                        if (!isCurrentActive)
                        {
                            if (lastSelection != null && lastSelection.activeInHierarchy && lastSelection.transform.IsChildOf(Current.transform))
                            {
                                EventSystem.current.SetSelectedGameObject(lastSelection);
                            }
                            else if (Current.defaultSelection != null && Current.defaultSelection.gameObject.activeInHierarchy)
                            {
                                EventSystem.current.SetSelectedGameObject(Current.defaultSelection.gameObject);
                                lastSelection = Current.defaultSelection.gameObject;
                            }
                        }
                        else
                        {
                            //Save last selection when everything is fine
                            lastSelection = selectedGameObject;
                        }
                    }
                }

                yield return(waitTime);
            }
        }