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