From 754995562ce45ca4acd7897eec9b2b4667a4fd2a Mon Sep 17 00:00:00 2001 From: hch <305670599@qq.com> Date: 星期二, 24 六月 2025 19:03:54 +0800 Subject: [PATCH] 0312 每个界面强制要求要有根节点 --- Main/System/UIBase/UIBase.cs | 260 ++++++++++++++++----------------------------------- 1 files changed, 81 insertions(+), 179 deletions(-) diff --git a/Main/System/UIBase/UIBase.cs b/Main/System/UIBase/UIBase.cs index 42d62ae..d8b24c0 100644 --- a/Main/System/UIBase/UIBase.cs +++ b/Main/System/UIBase/UIBase.cs @@ -24,7 +24,9 @@ SlideFromTop, // 浠庨《閮ㄦ粦鍏� SlideFromBottom, // 浠庡簳閮ㄦ粦鍏� SlideFromLeft, // 浠庡乏渚ф粦鍏� - SlideFromRight // 浠庡彸渚ф粦鍏� + SlideFromRight, // 浠庡彸渚ф粦鍏� + ScaleOverInOut,// 缂╂斁锛堣秴杩囷級涔嬪悗鍐嶈繑鍥� + } [RequireComponent(typeof(Canvas))] @@ -47,14 +49,15 @@ // 鍔ㄧ敾鐩稿叧 [SerializeField] public UIAnimationType openAnimationType = UIAnimationType.None; [SerializeField] public UIAnimationType closeAnimationType = UIAnimationType.None; + [SerializeField] protected RectTransform _rectTransform; //鐣岄潰榛樿娣诲姞鏍硅妭鐐圭敤浜庤〃鐜扮晫闈㈠紑鍚叧闂姩鐢伙紝鎴栬�呰缃�傞厤鐢� + [SerializeField]/*[HideInInspector]*/ public float animeDuration = 0.2f; + [SerializeField]public TweenCurve scaleOverInOutCurve; [SerializeField][HideInInspector] public Ease animationEase = Ease.OutQuad; // 纭繚浣跨敤 DG.Tweening.Ease // 杩愯鏃剁姸鎬� [HideInInspector] public int lastUsedRound = 0; [HideInInspector] public UIBase parentUI; - - [HideInInspector] public GameObject rootNode; // 鏍硅妭鐐� // 瀛怳I绠$悊 [HideInInspector] public List<UIBase> childrenUI = new List<UIBase>(); @@ -69,7 +72,13 @@ private Button btnClickEmptyClose; - protected int functionOrder = 0; + // 璺烵neLevelWin鑱斿姩 瀹為檯涓婃槸闇�瑕佺户鎵胯嚜OneLevelWin鎵嶈兘鐢熸晥鐨勫�� 浣跨敤闇�瑕佹敞鎰� + int m_FunctionOrder = 0; + public int functionOrder + { + get { return m_FunctionOrder; } + set { m_FunctionOrder = value; } + } // 鍐呴儴鐘舵�� protected bool isActive = false; @@ -79,7 +88,6 @@ // 缁勪欢寮曠敤 protected Canvas canvas; protected CanvasGroup canvasGroup; - protected RectTransform _rectTransform; // 鍔ㄧ敾鐩稿叧 protected Vector3 originalPosition; @@ -93,7 +101,6 @@ protected virtual void Awake() { - CreateRootNode(); // 闃叉鏈変汉涓嶅啓base.InitComponent寮曞彂閿欒 鎵�浠ユ媶鍒� InitComponentInternal(); // 鍦ˋwake涓繘琛屽熀鏈垵濮嬪寲 @@ -116,31 +123,6 @@ } } - private void CreateRootNode() - { - List<Transform> children = new List<Transform>(); - foreach (Transform child in transform) - { - children.Add(child); - } - - rootNode = new GameObject("WindowRoot"); - rootNode.transform.SetParent(transform, false); - rootNode.layer = LayerMask.NameToLayer("UI"); - _rectTransform = rootNode.AddMissingComponent<RectTransform>(); - _rectTransform.anchorMin = new Vector2(0.5f, 0.5f); - _rectTransform.anchorMax = new Vector2(0.5f, 0.5f); - _rectTransform.pivot = new Vector2(0.5f, 0.5f); - _rectTransform.sizeDelta = new Vector2(750, 1334); // 榛樿澶у皬锛屽彲浠ユ牴鎹渶瑕佽皟鏁� - _rectTransform.anchoredPosition = Vector2.zero; - _rectTransform.localScale = Vector3.one; - - foreach (Transform child in children) - { - child.SetParent(rootNode.transform, false); - } - } - protected virtual void Start() { // 瀛愮被鍙互閲嶅啓姝ゆ柟娉曡繘琛岄澶栧垵濮嬪寲 @@ -148,20 +130,20 @@ protected async UniTask ApplySettings() { - await UniTask.DelayFrame(5); - - if (null != transform) + if (clickEmptySpaceClose) { - if (clickEmptySpaceClose) - { - GameObject goBtnESC = GameObject.Instantiate(Resources.Load<GameObject>("Prefabs/ClickEmptyCloseMask"), transform); - // Load - btnClickEmptyClose = goBtnESC.GetComponent<Button>(); - btnClickEmptyClose.AddListener(CloseWindow); - btnClickEmptyClose.transform.SetAsFirstSibling(); - } + //寤惰繜鍒涘缓浼氬鑷村眰绾у湪ScreenMask涔嬩笂 + GameObject goBtnESC = GameObject.Instantiate(Resources.Load<GameObject>("Prefabs/ClickEmptyCloseMask"), transform); + btnClickEmptyClose = goBtnESC.GetComponent<Button>(); + btnClickEmptyClose.AddListener(CloseWindow); + btnClickEmptyClose.transform.SetAsFirstSibling(); + await UniTask.DelayFrame(5); + + btnClickEmptyClose = goBtnESC.GetComponent<Button>(); + btnClickEmptyClose.AddListener(CloseWindow); } } + protected async void ExecuteNextFrame(Action _action) { @@ -211,6 +193,9 @@ } canvasScaler = GetComponent<CanvasScaler>(); + canvasScaler.referenceResolution = Constants.DESIGN_RESOLUTION; + canvasScaler.uiScaleMode = CanvasScaler.ScaleMode.ScaleWithScreenSize; + canvasScaler.matchWidthOrHeight = 0; } // 鑾峰彇蹇呰鐨勭粍浠� @@ -241,6 +226,12 @@ // 鎵撳紑UI public void HandleOpen() { + if (_rectTransform == null) + { + Debug.LogError($"鐣岄潰: {uiName} 闇�瑕佽缃牴鑺傜偣_rectTransform "); + return; + } + OnPreOpen(); // 濡傛灉姝e湪鎾斁鍔ㄧ敾锛屽厛鍋滄 StopCurrentAnimation(); @@ -255,6 +246,13 @@ PlayOpenAnimation(); OnOpen(); + + ExecuteNextFrame(NextFrameAfterOpen); + } + + protected virtual void NextFrameAfterOpen() + { + } // 鍏抽棴UI - 淇敼鍚庣殑鏂规硶 @@ -275,7 +273,6 @@ // 绂佺敤浜や簰浣嗕繚鎸佸彲瑙� if (canvasGroup != null) { - canvasGroup.interactable = false; canvasGroup.blocksRaycasts = false; } @@ -339,143 +336,21 @@ /// <param name="autoDestroy">鏄惁鑷姩閿�姣侊紝榛樿涓簍rue</param> /// <param name="destroyDelay">鑷姩閿�姣佸欢杩熸椂闂达紝榛樿涓�5绉�</param> /// <returns>鐗规晥娓告垙瀵硅薄</returns> - public GameObject PlayUIEffect(int id, Transform parent = null, bool autoDestroy = true, float destroyDelay = 5f) + public EffectPlayer PlayUIEffect(int id, Transform parent = null, bool autoDestroy = true, float destroyDelay = 5f) { // 浣跨敤榛樿鍊� if (parent == null) parent = transform; - EffectConfig effectCfg = EffectConfig.Get(id); + EffectPlayer player = parent.gameObject.AddComponent<EffectPlayer>(); - if (null == effectCfg) - { - return null; - } + player.effectId = id; + player.autoDestroy = autoDestroy; + player.destroyDelay = destroyDelay; + player.canvas = canvas; - // 鍔犺浇鐗规晥璧勬簮 - var effectPrefab = ResManager.Instance.LoadAsset<GameObject>("UIEffect/" + effectCfg.packageName, effectCfg.fxName); - if (effectPrefab == null) - { - Debug.LogError($"鍔犺浇UI鐗规晥澶辫触: {effectCfg.packageName}"); - return null; - } - - // 瀹炰緥鍖栫壒鏁� - GameObject effectObj = Instantiate(effectPrefab, parent); - effectObj.name = $"Effect_{effectCfg.packageName}"; - - // 娣诲姞鐗规晥绌块�忛樆鎸″櫒 - EffectPenetrationBlocker blocker = effectObj.AddComponent<EffectPenetrationBlocker>(); - blocker.parentCanvas = canvas; - - // 寤惰繜涓�甯ф墠鐢熸晥 - this.DelayFrame(blocker.UpdateSortingOrder); - - // blocker.UpdateSortingOrder(); - - // 鑷姩閿�姣� - if (autoDestroy) - { - Destroy(effectObj, destroyDelay); - } - - return effectObj; + return player; } - /// <summary> - /// 鍦ㄤ袱涓猆I鍏冪礌涔嬮棿鎾斁鐗规晥锛堟寜鐓ortingOrder鐨勪腑闂村�硷級 - /// </summary> - /// <param name="effectName">鐗规晥璧勬簮鍚嶇О</param> - /// <param name="frontElement">鍓嶆櫙UI鍏冪礌锛圛mage鎴朢awImage锛�</param> - /// <param name="backElement">鑳屾櫙UI鍏冪礌锛圛mage鎴朢awImage锛�</param> - /// <param name="autoDestroy">鏄惁鑷姩閿�姣侊紝榛樿涓簍rue</param> - /// <param name="destroyDelay">鑷姩閿�姣佸欢杩熸椂闂达紝榛樿涓�5绉�</param> - /// <returns>鐗规晥娓告垙瀵硅薄</returns> - public async UniTask<GameObject> PlayEffectBetweenUIElements(string effectName, Graphic frontElement, Graphic backElement, bool autoDestroy = true, float destroyDelay = 5f) - { - if (frontElement == null || backElement == null) - { - Debug.LogError("鍓嶆櫙鎴栬儗鏅疷I鍏冪礌涓虹┖"); - return null; - } - - // 纭繚UI鍏冪礌鍦ㄥ綋鍓峌IBase鐨凜anvas涓� - if (frontElement.canvas != canvas || backElement.canvas != canvas) - { - Debug.LogError("UI鍏冪礌涓嶅湪褰撳墠UIBase鐨凜anvas涓�"); - return null; - } - - // 鍔犺浇鐗规晥璧勬簮 - GameObject effectPrefab = ResManager.Instance.LoadAsset<GameObject>("UIEffect", effectName); - if (effectPrefab == null) - { - Debug.LogError($"鍔犺浇UI鐗规晥澶辫触: {effectName}"); - return null; - } - - // 鍒涘缓涓�涓柊鐨凣ameObject浣滀负鐗规晥瀹瑰櫒 - GameObject container = new GameObject($"EffectContainer_{effectName}"); - container.transform.SetParent(transform, false); - - // 璁剧疆瀹瑰櫒浣嶇疆 - RectTransform containerRect = container.AddComponent<RectTransform>(); - containerRect.anchorMin = new Vector2(0.5f, 0.5f); - containerRect.anchorMax = new Vector2(0.5f, 0.5f); - containerRect.pivot = new Vector2(0.5f, 0.5f); - containerRect.anchoredPosition = Vector2.zero; - containerRect.sizeDelta = new Vector2(100, 100); // 榛樿澶у皬锛屽彲浠ユ牴鎹渶瑕佽皟鏁� - - // 鑾峰彇鍓嶆櫙鍜岃儗鏅厓绱犵殑siblingIndex - int frontIndex = frontElement.transform.GetSiblingIndex(); - int backIndex = backElement.transform.GetSiblingIndex(); - - // 璁剧疆鐗规晥瀹瑰櫒鐨剆iblingIndex鍦ㄤ袱鑰呬箣闂� - if (frontIndex > backIndex) - { - // 鍓嶆櫙鍦ㄨ儗鏅箣鍚庯紝鐗规晥搴旇鍦ㄤ腑闂� - container.transform.SetSiblingIndex((frontIndex + backIndex) / 2 + 1); - } - else - { - // 鑳屾櫙鍦ㄥ墠鏅箣鍚庯紝鐗规晥搴旇鍦ㄤ腑闂� - container.transform.SetSiblingIndex((frontIndex + backIndex) / 2); - } - - // 瀹炰緥鍖栫壒鏁� - GameObject effectObj = Instantiate(effectPrefab, container.transform); - effectObj.name = $"Effect_{effectName}"; - - // 娣诲姞鐗规晥绌块�忛樆鎸″櫒 - EffectPenetrationBlocker blocker = effectObj.AddComponent<EffectPenetrationBlocker>(); - - // 鐩存帴璁剧疆鐗规晥娓叉煋鍣ㄧ殑鎺掑簭椤哄簭 - Renderer[] renderers = effectObj.GetComponentsInChildren<Renderer>(true); - foreach (Renderer renderer in renderers) - { - renderer.sortingOrder = canvas.sortingOrder; - renderer.sortingLayerName = canvas.sortingLayerName; - } - - // 璁剧疆绮掑瓙绯荤粺娓叉煋鍣ㄧ殑鎺掑簭椤哄簭 - ParticleSystem[] particleSystems = effectObj.GetComponentsInChildren<ParticleSystem>(true); - foreach (ParticleSystem ps in particleSystems) - { - ParticleSystemRenderer psRenderer = ps.GetComponent<ParticleSystemRenderer>(); - if (psRenderer != null) - { - psRenderer.sortingOrder = canvas.sortingOrder; - psRenderer.sortingLayerName = canvas.sortingLayerName; - } - } - - // 鑷姩閿�姣� - if (autoDestroy) - { - Destroy(container, destroyDelay); - } - - return effectObj; - } #endregion public bool raycastTarget @@ -524,7 +399,6 @@ if (canvasGroup != null) { canvasGroup.alpha = 0f; - canvasGroup.interactable = false; canvasGroup.blocksRaycasts = false; } if (canvasScaler != null) @@ -537,7 +411,6 @@ if (canvasGroup != null) { canvasGroup.alpha = 1f; - canvasGroup.interactable = false; canvasGroup.blocksRaycasts = false; } if (canvasScaler != null) @@ -585,6 +458,17 @@ _rectTransform.anchoredPosition = startPos; } break; + case UIAnimationType.ScaleOverInOut: + if (canvasGroup != null) + { + canvasGroup.alpha = 1f; + canvasGroup.blocksRaycasts = false; + } + if (canvasScaler != null) + { + canvasScaler.scaleFactor = 0.3f; + } + break; } try @@ -618,23 +502,42 @@ currentAnimation.Append(_rectTransform.DOAnchorPos(originalPosition, animeDuration).SetEase(animationEase)); } break; + case UIAnimationType.ScaleOverInOut: + if (_rectTransform != null) + { + if (null == scaleOverInOutCurve) + { + currentAnimation.Append(DOVirtual.Float(0.3f, 1.2f, animeDuration, + (value) => {canvasScaler.scaleFactor = value;}).SetEase(animationEase)); + } + else + { + currentAnimation.Append(DOVirtual.Float(0.3f, 1.2f, animeDuration, + (value) => {canvasScaler.scaleFactor = value;}).SetEase(scaleOverInOutCurve.curve)); + } + + + // currentAnimation.Append(DOVirtual.Float(1.2f, 1f, 0.1f, (value) => {canvasScaler.scaleFactor = value;}).SetEase(scaleOverInOutCurve)); + } + break; } // 鍔ㄧ敾瀹屾垚鍚庣殑鍥炶皟 currentAnimation.OnComplete(() => { isAnimating = false; - + _ResetToBegin(); OnOpenAnimationComplete(); // 鍚敤浜や簰 if (canvasGroup != null) { - canvasGroup.interactable = true; canvasGroup.blocksRaycasts = true; } }); + + // currentAnimation.ingoreTimeScale = true; currentAnimation.Play(); } @@ -646,7 +549,6 @@ if (canvasGroup != null) { canvasGroup.alpha = 1f; - canvasGroup.interactable = true; canvasGroup.blocksRaycasts = true; } isAnimating = false; @@ -663,8 +565,7 @@ if (canvasGroup != null) { canvasGroup.alpha = 1f; - canvasGroup.interactable = false; - canvasGroup.blocksRaycasts = false; + canvasGroup.blocksRaycasts = true; } if (canvasScaler != null) { @@ -709,6 +610,7 @@ break; case UIAnimationType.ScaleInOut: + case UIAnimationType.ScaleOverInOut: if (_rectTransform != null) { currentAnimation.Append(DOVirtual.Float(1f, 0.3f, animeDuration, (value) => {canvasScaler.scaleFactor = value;}).SetEase(animationEase)); -- Gitblit v1.8.0