public Coroutine LeaveOverlayViewPage(string viewPageName, float tweenTimeIfNeed = 0.4F, Action OnComplete = null, bool ignoreTransition = false, bool ignoreTimeScale = false, bool waitForShowFinish = false) { if (!CheckTimeProtect()) { ViewSystemLog.LogWarning($"Method call return due to TimeProtect."); return(null); } // var nextViewPage = viewPages.SingleOrDefault(m => m.name == viewPageName); if (!viewPages.TryGetValue(viewPageName, out nextOverlayViewPage)) { ViewSystemLog.LogError("No overlay viewPage match the name: " + viewPageName + " found"); return(null); } string OverlayPageStateKey = GetOverlayStateKey(nextOverlayViewPage); if (!overlayPageStatusDict.TryGetValue(OverlayPageStateKey, out ViewSystemUtilitys.OverlayPageStatus overlayPageStatus)) { ViewSystemLog.LogError("No live overlay viewPage of name: " + viewPageName + " found, try to fix."); overlayPageStatus = new ViewSystemUtilitys.OverlayPageStatus(); overlayPageStatus.viewPage = nextOverlayViewPage; viewStates.TryGetValue(nextOverlayViewPage.viewState, out nextViewState); if (nextViewState != null) { overlayPageStatus.viewState = nextViewState; } } else { if (overlayPageStatus.transition == ViewSystemUtilitys.OverlayPageStatus.Transition.Show && waitForShowFinish == false) { ViewSystemLog.LogError($"The Overlay page {nextOverlayViewPage.name} is in Transition, ignore the LeaveOverlayViewPage call."); return(null); } if (overlayPageStatus.transition == ViewSystemUtilitys.OverlayPageStatus.Transition.Leave) { ViewSystemLog.LogError($"The Overlay page {nextOverlayViewPage.name} is in Leaving, ignore the LeaveOverlayViewPage call."); return(null); } } overlayPageStatus.pageChangeCoroutine = StartCoroutine(LeaveOverlayViewPageBase(overlayPageStatus, tweenTimeIfNeed, OnComplete, ignoreTransition, ignoreTimeScale, waitForShowFinish)); return(overlayPageStatus.pageChangeCoroutine); }
public override IEnumerator LeaveOverlayViewPageBase(ViewSystemUtilitys.OverlayPageStatus overlayPageState, float tweenTimeIfNeed, Action OnComplete, bool ignoreTransition = false, bool ignoreTimeScale = false, bool waitForShowFinish = false) { if (waitForShowFinish && overlayPageState.transition == ViewSystemUtilitys.OverlayPageStatus.Transition.Show) { ViewSystemLog.Log("Leave Overlay Page wait for pervious page"); yield return(new WaitUntil(() => !overlayPageState.IsTransition)); } var currentVe = currentViewPage.viewPageItems.Select(m => m.runtimeViewElement); var currentVs = currentViewState.viewPageItems.Select(m => m.runtimeViewElement); var finishTime = ViewSystemUtilitys.CalculateOnLeaveDuration(overlayPageState.viewPage.viewPageItems.Select(m => m.runtimeViewElement)); overlayPageState.transition = ViewSystemUtilitys.OverlayPageStatus.Transition.Leave; List <ViewPageItem> viewPageItems = new List <ViewPageItem>(); viewPageItems.AddRange(overlayPageState.viewPage.viewPageItems); if (overlayPageState.viewState != null) { viewPageItems.AddRange(overlayPageState.viewState.viewPageItems); } foreach (var item in viewPageItems) { if (item.runtimeViewElement == null) { ViewSystemLog.LogWarning($"ViewElement : {item.viewElement.name} is null in runtime."); continue; } // Unique 的 ViewElement 另外處理借用問題 // 暫時不處理 多個 overlay 之間借用的問題!!! if (item.runtimeViewElement.IsUnique == true && IsPageTransition == false) { if (currentVe.Contains(item.runtimeViewElement)) { //準備自動離場的 ViewElement 目前的頁面正在使用中 所以不要對他操作 try { var vpi = currentViewPage.viewPageItems.FirstOrDefault(m => ReferenceEquals(m.runtimeViewElement, item.runtimeViewElement)); var transformData = vpi.GetCurrentViewElementTransform(breakPointsStatus); if (!string.IsNullOrEmpty(transformData.parentPath)) { vpi.runtimeParent = transformCache.Find(transformData.parentPath); } else { vpi.runtimeParent = currentViewPage.runtimePageRoot; } item.runtimeViewElement.ChangePage(true, vpi.runtimeParent, transformData, item.sortingOrder, tweenTimeIfNeed, 0); ViewSystemLog.LogWarning("ViewElement : " + item.viewElement.name + "Try to back to origin Transfrom parent : " + vpi.runtimeParent.name); } catch { } continue; } if (currentVs.Contains(item.runtimeViewElement)) { //準備自動離場的 ViewElement 目前的頁面正在使用中 所以不要對他操作 try { var vpi = currentViewState.viewPageItems.FirstOrDefault(m => ReferenceEquals(m.runtimeViewElement, item.runtimeViewElement)); var transformData = vpi.GetCurrentViewElementTransform(breakPointsStatus); if (!string.IsNullOrEmpty(transformData.parentPath)) { vpi.runtimeParent = transformCache.Find(transformData.parentPath); } else { vpi.runtimeParent = currentViewPage.runtimePageRoot; } item.runtimeViewElement.ChangePage(true, vpi.runtimeParent, transformData, item.sortingOrder, tweenTimeIfNeed, 0); ViewSystemLog.LogWarning("ViewElement : " + item.runtimeViewElement.name + "Try to back to origin Transfrom parent : " + vpi.runtimeParent.name); } catch { } continue; } } // lastOverlayPageItemDelayOutTimes.TryGetValue(item.runtimeViewElement.name, out float delayOut); item.runtimeViewElement.ChangePage(false, null, null, item.sortingOrder, 0, 0, ignoreTransition); } yield return(runtimePool.RecoveryQueuedViewElement()); //Get Back the Navigation to CurrentPage SetNavigationTarget(currentViewPage); InvokeOnOverlayPageLeave(this, new ViewPageEventArgs(overlayPageState.viewPage, null)); if (ignoreTimeScale) { yield return(Yielders.GetWaitForSecondsRealtime(finishTime)); } else { yield return(Yielders.GetWaitForSeconds(finishTime)); } overlayPageState.IsTransition = false; string OverlayPageStateKey = GetOverlayStateKey(overlayPageState.viewPage); overlayPageStatusDict.Remove(OverlayPageStateKey); OnComplete?.Invoke(); }
public virtual IEnumerator LeaveOverlayViewPageBase(ViewSystemUtilitys.OverlayPageStatus overlayPageState, float tweenTimeIfNeed, Action OnComplete, bool ignoreTransition = false, bool ignoreTimeScale = false, bool waitForShowFinish = false) { //Empty implement will override in child class yield return(null); }
public override IEnumerator ShowOverlayViewPageBase(ViewPage vp, bool RePlayOnShowWhileSamePage, Action OnStart, Action OnChanged, Action OnComplete, bool ignoreTimeScale) { // Debug.Log("ShowOverlayViewPageBase " + vp.name); if (vp == null) { ViewSystemLog.Log("ViewPage is null"); yield break; } if (vp.viewPageType != ViewPage.ViewPageType.Overlay) { ViewSystemLog.LogError("ViewPage " + vp.name + " is not an Overlay page"); yield break; } //Prepare runtime page root string viewPageRootName = ViewSystemUtilitys.GetPageRootName(vp); var pageWrapper = ViewSystemUtilitys.CreatePageTransform(viewPageRootName, rootCanvasTransform, vp.canvasSortOrder); if (vp.runtimePageRoot == null) { vp.runtimePageRoot = pageWrapper.rectTransform; } pageWrapper.safePadding.SetPaddingValue(vp.edgeValues); ViewState viewState = null; viewStates.TryGetValue(vp.viewState, out viewState); List <ViewElement> viewElementDoesExitsInNextPage = new List <ViewElement>(); IEnumerable <ViewPageItem> viewItemNextPage = null; IEnumerable <ViewPageItem> viewItemNextState = null; List <ViewPageItem> viewItemForNextPage = new List <ViewPageItem>(); string OverlayPageStateKey = GetOverlayStateKey(vp); bool samePage = false; //檢查是否有同 State 的 Overlay 頁面在場上 if (overlayPageStatusDict.TryGetValue(OverlayPageStateKey, out ViewSystemUtilitys.OverlayPageStatus overlayPageStatus)) { viewItemNextPage = PrepareRuntimeReference(GetAllViewPageItemInViewPage(vp)); //同 OverlayState 的頁面已經在場上,移除不同的部分,然後顯示新加入的部分 if (!string.IsNullOrEmpty(vp.viewState)) { if (overlayPageStatus.viewPage.name != vp.name) { // 同 State 不同 Page 的情況,找到差異的部分 foreach (var item in overlayPageStatus.viewPage.viewPageItems) { if (!vp.viewPageItems.Select(m => m.runtimeViewElement).Contains(item.runtimeViewElement)) { viewElementDoesExitsInNextPage.Add(item.runtimeViewElement); } } overlayPageStatus.viewPage = vp; } } else { //只有 ViewPage 卻還是進來這裡的話代表頁面還在場上 // RePlayOnShowWhileSamePage == false 那就更新數值 所以停掉舊的 Coroutine if (overlayPageStatus.pageChangeCoroutine != null) { StopCoroutine(overlayPageStatus.pageChangeCoroutine); } samePage = true; overlayPageStatus.transition = ViewSystemUtilitys.OverlayPageStatus.Transition.Show; } } else { //同 OverlayState 的頁面還不在場上 新建一個 Status overlayPageStatus = new ViewSystemUtilitys.OverlayPageStatus(); overlayPageStatus.viewPage = vp; overlayPageStatus.viewState = viewState; overlayPageStatus.transition = ViewSystemUtilitys.OverlayPageStatus.Transition.Show; viewItemNextPage = PrepareRuntimeReference(GetAllViewPageItemInViewPage(vp)); // 沒有 viewState 的 Page 不需要處理 viewState 的 runtimeViewElement if (!string.IsNullOrEmpty(vp.viewState)) { // nextViewState = viewStates.SingleOrDefault(m => m.name == vp.viewState); if (viewStates.TryGetValue(vp.viewState, out nextViewState)) { viewItemNextState = GetAllViewPageItemInViewState(nextViewState); viewItemNextState = PrepareRuntimeReference(viewItemNextState); } } overlayPageStatusDict.Add(OverlayPageStateKey, overlayPageStatus); } OnStart?.Invoke(); float onShowTime = ViewSystemUtilitys.CalculateOnShowDuration(viewItemNextPage.Select(m => m.runtimeViewElement)); float onShowDelay = ViewSystemUtilitys.CalculateDelayInTime(viewItemNextPage); //對離場的呼叫改變狀態 foreach (var item in viewElementDoesExitsInNextPage) { Debug.LogWarning($"{item.name} not exsit in next page"); item.ChangePage(false, null, null, 0, 0, 0); } viewItemForNextPage.AddRange(viewItemNextPage); if (viewItemNextState != null) { viewItemForNextPage.AddRange(viewItemNextState); } //對進場的呼叫改變狀態 foreach (var item in viewItemNextPage) { if (RePlayOnShowWhileSamePage && samePage) { item.runtimeViewElement.OnShow(); continue; } //套用複寫值 item.runtimeViewElement.ApplyOverrides(item.overrideDatas); item.runtimeViewElement.ApplyEvent(item.eventDatas); var transformData = item.GetCurrentViewElementTransform(breakPointsStatus); if (!string.IsNullOrEmpty(transformData.parentPath)) { item.runtimeParent = transformCache.Find(transformData.parentPath); } else { item.runtimeParent = vp.runtimePageRoot; } item.runtimeViewElement.ChangePage(true, item.runtimeParent, transformData, item.sortingOrder, item.TweenTime, item.delayIn, reshowIfSamePage: RePlayOnShowWhileSamePage); } SetNavigationTarget(vp); yield return(runtimePool.RecoveryQueuedViewElement()); //Fire the event OnChanged?.Invoke(); InvokeOnOverlayPageShow(this, new ViewPageEventArgs(vp, null)); //當所有表演都結束時 if (ignoreTimeScale) { yield return(Yielders.GetWaitForSecondsRealtime(onShowTime + onShowDelay)); } else { yield return(Yielders.GetWaitForSeconds(onShowTime + onShowDelay)); } overlayPageStatus.IsTransition = false; OnComplete?.Invoke(); }