public UIBaseScreen ShowScreen(UIBaseScreen screen, bool force = false) { if (screen == null) { throw new KeyNotFoundException("UIScreenManager: Show(UIBaseScreen) failed, screen is Null."); } if (!force && (mScreenQueueDirty || screenQueue.LastOrDefault() == screen)) { return(screen); } screenQueue.Add(screen); InsertionSort(screenQueue); if (CurrentScreen == null || (int)CurrentScreen.Priority <= (int)screen.Priority) { if (CurrentScreen != null) { CurrentScreen.OnDeactivated(false); } mScreenQueueDirty = true; } return(screen); }
IEnumerator CoroutineUpdate() { var waitTime = new WaitForSecondsRealtime(0.1f); while (true) { if (mScreenQueueDirty) { if (mScreenToKill != null && mScreenToKill == CurrentScreen) { if (onScreenHide != null) { onScreenHide.Invoke(CurrentScreen); } int screenToKillIndex = screenQueue.FindLastIndex(x => x == mScreenToKill); if (screenToKillIndex != -1) { screenQueue.RemoveAt(screenToKillIndex); } EventSystem.current.SetSelectedGameObject(null); mScreenToKill.SelectedObject = null; mScreenToKill.OnDeactivated(true, true); if (mScreenToKill.keepOnTopWhenHiding) { mScreenToKeepOnTop = mScreenToKill; } mScreenToKill = null; CurrentScreen = null; } if (screenQueue.Count == 0 && mScreenToShowInTheEnd != null) { screenQueue.Add(mScreenToShowInTheEnd); mScreenToShowInTheEnd = null; } UIBaseScreen maxPriorityScreen = screenQueue.LastOrDefault(); if (CurrentScreen != maxPriorityScreen) { UIBaseScreen previousScreen = CurrentScreen; if (previousScreen != null) { previousScreen.SelectedObject = EventSystem.current.currentSelectedGameObject; EventSystem.current.SetSelectedGameObject(null); } if (maxPriorityScreen.Transition) { CurrentScreen = null; mScreenQueueDirty = true; yield return(waitTime); continue; } else { CurrentScreen = maxPriorityScreen; if (CurrentScreen == null && DefaultScreen != null) { CurrentScreen = DefaultScreen; } if (CurrentScreen != null) { if (onScreenShow != null) { onScreenShow.Invoke(CurrentScreen); } CurrentScreen.OnActivated(); } if (previousScreen != null) { previousScreen.OnDeactivated(CurrentScreen.hideCurrent); } if (mScreenToKeepOnTop != null && mScreenToKeepOnTop.isActiveAndEnabled) { mScreenToKeepOnTop.transform.SetAsLastSibling(); mScreenToKeepOnTop = null; } } } mScreenQueueDirty = false; } if (!IsTouchMode && alwaysOnSelection) { if (CurrentScreen != null && !CurrentScreen.Transition) { GameObject selectedGameObject = EventSystem.current.currentSelectedGameObject; bool isCurrentActive = (selectedGameObject != null && selectedGameObject.activeInHierarchy); if (!isCurrentActive) { if (lastSelection != null && lastSelection.activeInHierarchy && lastSelection.transform.IsChildOf(CurrentScreen.transform)) { EventSystem.current.SetSelectedGameObject(lastSelection); } else if (CurrentScreen.DefaultSelection != null && CurrentScreen.DefaultSelection.gameObject.activeInHierarchy) { EventSystem.current.SetSelectedGameObject(CurrentScreen.DefaultSelection.gameObject); lastSelection = CurrentScreen.DefaultSelection.gameObject; } } else { lastSelection = selectedGameObject; } } } yield return(waitTime); } }