public void ApplyRectTransform(ViewElementTransform viewElementTransform, RectTransformFlag?overrideFlag = null) { var currentFlag = overrideFlag.HasValue ? overrideFlag.Value : viewElementTransform.rectTransformFlag; if (FlagsHelper.IsSet(currentFlag, RectTransformFlag.SizeDelta)) { rectTransform.sizeDelta = viewElementTransform.rectTransformData.sizeDelta; } if (FlagsHelper.IsSet(currentFlag, RectTransformFlag.AnchoredPosition)) { rectTransform.anchoredPosition3D = viewElementTransform.rectTransformData.anchoredPosition; } if (FlagsHelper.IsSet(currentFlag, RectTransformFlag.AnchorMax)) { rectTransform.anchorMax = viewElementTransform.rectTransformData.anchorMax; } if (FlagsHelper.IsSet(currentFlag, RectTransformFlag.AnchorMin)) { rectTransform.anchorMin = viewElementTransform.rectTransformData.anchorMin; } if (FlagsHelper.IsSet(currentFlag, RectTransformFlag.LocalEulerAngles)) { rectTransform.localEulerAngles = viewElementTransform.rectTransformData.localEulerAngles; } if (FlagsHelper.IsSet(currentFlag, RectTransformFlag.LocalScale)) { rectTransform.localScale = viewElementTransform.rectTransformData.localScale; } if (FlagsHelper.IsSet(currentFlag, RectTransformFlag.Pivot)) { rectTransform.pivot = viewElementTransform.rectTransformData.pivot; } }
public IEnumerator OnChangePageRunner(bool show, Transform parent, ViewElementTransform rectTransformData, float TweenTime, float delayIn, bool ignoreTransition, bool reshowIfSamePage) { if (lifeCyclesObjects != null) { foreach (var item in lifeCyclesObjects.ToArray()) { try { item.OnChangePage(show); } catch (Exception ex) { ViewSystemLog.LogError(ex.ToString(), this); } } } if (show) { if (parent == null) { ViewSystemLog.LogError($"{gameObject.name} does not set the parent for next viewpage.", this); goto END; //throw new NullReferenceException(gameObject.name + " does not set the parent for next viewpage."); } //停掉正在播放的 Leave 動畫 if (leaveCoroutine != null) { // viewController.StopCoroutine(OnLeaveCoroutine); } //還在池子裡,應該先 OnShow //或是正在離開,都要重播 OnShow if (IsShowed == false || OnLeaveWorking) { rectTransform.SetParent(parent, true); if (rectTransformData == null || !string.IsNullOrEmpty(rectTransformData.parentPath)) { rectTransform.anchoredPosition3D = Vector3.zero; rectTransform.localScale = Vector3.one; } else { ApplyRectTransform(rectTransformData); } float time = 0; while (time < delayIn) { time += GlobalTimer.deltaTime; yield return(null); } OnShow(); goto END; } //已經在場上的 else { //如果目前的 parent 跟目標的 parent 是同一個人 那就什麼事都不錯 if ((rectTransformData == null || !string.IsNullOrEmpty(rectTransformData.parentPath)) && parent.GetInstanceID() == rectTransform.parent.GetInstanceID()) { //ViewSystemLog.LogWarning("Due to already set the same parent with target parent, ignore " + name); if (reshowIfSamePage) { OnShow(); } goto END; } //其他的情況下用 Tween 過去 if (TweenTime >= 0) { rectTransform.SetParent(parent, true); if (rectTransformData == null || !string.IsNullOrEmpty(rectTransformData.parentPath)) { var marginFixer = GetComponent <ViewMarginFixer>(); viewController.StartMicroCoroutine(EaseUtility.To( rectTransform.anchoredPosition3D, Vector3.zero, TweenTime, EaseStyle.QuadEaseOut, (v) => { rectTransform.anchoredPosition3D = v; }, () => { if (marginFixer) { marginFixer.ApplyModifyValue(); } } )); viewController.StartMicroCoroutine(EaseUtility.To( rectTransform.localScale, Vector3.one, TweenTime, EaseStyle.QuadEaseOut, (v) => { rectTransform.localScale = v; } )); } else { rectTransform.SetParent(parent, true); var flag = rectTransformData.rectTransformFlag; FlagsHelper.Unset(ref flag, RectTransformFlag.AnchoredPosition); FlagsHelper.Unset(ref flag, RectTransformFlag.LocalScale); ApplyRectTransform(rectTransformData, flag); viewController.StartMicroCoroutine(EaseUtility.To( rectTransform.anchoredPosition3D, rectTransformData.rectTransformData.anchoredPosition, TweenTime, EaseStyle.QuadEaseOut, (v) => { rectTransform.anchoredPosition3D = v; }, () => { } )); viewController.StartMicroCoroutine(EaseUtility.To( rectTransform.localScale, rectTransformData.rectTransformData.localScale, TweenTime, EaseStyle.QuadEaseOut, (v) => { rectTransform.localScale = v; }, () => { } )); } goto END; } //TweenTime 設定為 <0 的情況下,代表要完整 OnLeave 在 OnShow else { float time = 0; while (time < delayIn) { time += GlobalTimer.deltaTime; yield return(null); } OnLeave(ignoreTransition: ignoreTransition); while (OnLeaveWorking == true) { yield return(null); } ViewSystemLog.LogWarning("Try to ReShow ", this); rectTransform.SetParent(parent, true); if (rectTransformData == null || !string.IsNullOrEmpty(rectTransformData.parentPath)) { rectTransform.anchoredPosition3D = Vector3.zero; rectTransform.localScale = Vector3.one; } else { ApplyRectTransform(rectTransformData); } time = 0; while (time < delayIn) { time += GlobalTimer.deltaTime; yield return(null); } OnShow(); goto END; } } } else { OnLeave(ignoreTransition: ignoreTransition); goto END; } END: changePageCoroutine = null; yield break; }
public virtual void ChangePage(bool show, Transform parent, ViewElementTransform rectTransformData, int sortingOrder = 0, float TweenTime = 0, float delayIn = 0, bool ignoreTransition = false, bool reshowIfSamePage = false) { this.sortingOrder = sortingOrder; NormalizeViewElement(); changePageCoroutine = viewController.StartMicroCoroutine(OnChangePageRunner(show, parent, rectTransformData, TweenTime, delayIn, ignoreTransition, reshowIfSamePage)); }