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