From b0a5d4688f1af73b5ad03ccc2df11c9aac1523a9 Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期二, 29 七月 2025 16:56:23 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.1.20:10010/r/Project_SG_scripts

---
 Main/System/UIBase/UIBase.cs |  417 +++++++++++++++++++++++++----------------------------------
 1 files changed, 175 insertions(+), 242 deletions(-)

diff --git a/Main/System/UIBase/UIBase.cs b/Main/System/UIBase/UIBase.cs
index a43f51e..02d2031 100644
--- a/Main/System/UIBase/UIBase.cs
+++ b/Main/System/UIBase/UIBase.cs
@@ -9,9 +9,9 @@
 public enum UILayer
 {
     Static, // 闈欐�乁I 閫傚悎鍋� 鎴樻枟 涓荤晫闈�
-    Bottom, // 涓荤晫闈�
-    Mid,    // 鍔熻兘绐楀彛
-    System,  // 缃戠粶寮圭獥/鍏朵粬閲嶈寮圭獥
+    Bottom, // 閮ㄥ垎鐣岄潰鐗规畩澶勭悊灞傜骇鐢�
+    Mid,    // 澶ч儴鍒嗗姛鑳界獥鍙i兘鏀捐繖灞傦紝渚夸簬璺宠浆涓婁笅灞傜鐞嗭紙涓�涓晫闈㈠彲浠ュ悓鏃跺瓨鍦ㄥ涓級
+    System,  // 缃戠粶寮圭獥锛屼俊鎭彁绀虹瓑锛屽叾浠栭噸瑕佸脊绐�
     Loading,    // 鍔犺浇鐣岄潰
 
 }
@@ -24,7 +24,9 @@
     SlideFromTop, // 浠庨《閮ㄦ粦鍏�
     SlideFromBottom, // 浠庡簳閮ㄦ粦鍏�
     SlideFromLeft, // 浠庡乏渚ф粦鍏�
-    SlideFromRight // 浠庡彸渚ф粦鍏�
+    SlideFromRight, // 浠庡彸渚ф粦鍏�
+    ScaleOverInOut,// 缂╂斁鏍规嵁鏇茬嚎
+
 }
 
 [RequireComponent(typeof(Canvas))]
@@ -38,16 +40,26 @@
     [SerializeField] public UILayer uiLayer = UILayer.Mid;
     [SerializeField][HideInInspector] public string uiName;
     [SerializeField] public bool isMainUI = false;
-    [SerializeField] public bool supportParentChildRelation = true; // 鏂板锛氭槸鍚︽敮鎸佺埗瀛愬叧绯�
+
+    // 鏂板锛氭槸鍚︽敮鎸佺埗瀛愬叧绯�
+    // 鐖跺瓙鍏崇郴:UI鎷ユ湁鐨勪笂涓嬬骇閾惧紡鍏崇郴
+    // 鍦ㄩ潪鐗瑰畾鎯呭喌涓� 閮借鎷ユ湁鐖跺瓙鍏崇郴 锛堜竴鑸潵璇村姛鑳介兘瑕佹湁鐖跺瓙鍏崇郴 渚嬪鐨勬槸渚嬪绯荤粺寮圭獥 
+    // 涓荤晫闈㈣繖绉嶄笉闇�瑕� 鍦ㄥ埗浣淯I浼�  鐩墠鐨勯渶姹傛槸 鍔熻兘鍏ㄩ儴鍋氬湪Middle灞傦級
+    // 鎷ユ湁鐖跺瓙鍏崇郴 鍦ㄥ叧闂埗鐣岄潰鐨勬椂鍊� 瀛愮晫闈細杩炲悓涓�璧峰叧闂� 瀛愮晫闈㈡墦寮�鏃� 鐖剁晫闈㈢殑鈥滃洖鍚堟暟鈥濅細鍒锋柊 鍥炲悎鏁拌瑙佹寔涔呭寲鐩稿叧鐨勬敞閲�
+    // 
+    [SerializeField] public bool supportParentChildRelation = true; 
 
     // 鎸佷箙鍖栫浉鍏�
     [SerializeField] public bool isPersistent = false;
     [SerializeField][HideInInspector] public int maxIdleRounds = 20;
 
     // 鍔ㄧ敾鐩稿叧
-    [SerializeField] public UIAnimationType openAnimationType = UIAnimationType.ScaleInOut;
+    [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
 
     // 杩愯鏃剁姸鎬�
@@ -60,14 +72,21 @@
     //  鎵撳紑閬僵
     [SerializeField] public bool openMask = false;
 
-    //  鐐瑰嚮绌虹櫧鍖哄煙鍏抽棴鐣岄潰
+    //  榛樿鐐瑰嚮绌虹櫧鍖哄煙鍏抽棴鐣岄潰
     [SerializeField] public bool clickEmptySpaceClose = false;
 
     private GameObject screenMask = null;
 
     private Button btnClickEmptyClose;
+    public Action btnClickEmptyCloseEvent = null;   //鎻愪緵鐐瑰嚮绌虹櫧鍖哄煙鍏抽棴鐣岄潰鐨勫洖璋�
 
-    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;
@@ -77,10 +96,8 @@
     // 缁勪欢寮曠敤
     protected Canvas canvas;
     protected CanvasGroup canvasGroup;
-    protected RectTransform rectTransform;
 
     // 鍔ㄧ敾鐩稿叧
-    protected Vector3 originalScale;
     protected Vector3 originalPosition;
     protected Sequence currentAnimation;
 
@@ -92,19 +109,16 @@
 
     protected virtual void Awake()
     {
-        // 纭繚 DOTween 宸插垵濮嬪寲
-        DOTween.SetTweensCapacity(500, 50);
-
         //  闃叉鏈変汉涓嶅啓base.InitComponent寮曞彂閿欒 鎵�浠ユ媶鍒�
         InitComponentInternal();
         // 鍦ˋwake涓繘琛屽熀鏈垵濮嬪寲
         InitComponent();
 
         // 淇濆瓨鍘熷鍊肩敤浜庡姩鐢�
-        if (rectTransform != null)
+        if (_rectTransform != null)
         {
-            originalScale = rectTransform.localScale;
-            originalPosition = rectTransform.anchoredPosition;
+            originalPosition = _rectTransform.anchoredPosition;;
+
         }
 
         ApplySettings();
@@ -125,20 +139,28 @@
 
     protected async UniTask ApplySettings()
     {
-        await UniTask.DelayFrame(5);
-
-        if (null != transform)
+        if (clickEmptySpaceClose)
         {
-            if (clickEmptySpaceClose)
+            //寤惰繜鍒涘缓浼氬鑷村眰绾у湪ScreenMask涔嬩笂
+            GameObject goBtnESC = GameObject.Instantiate(Resources.Load<GameObject>("Prefabs/ClickEmptyCloseMask"), transform);
+            btnClickEmptyClose = goBtnESC.GetComponent<Button>();
+            btnClickEmptyClose.transform.SetAsFirstSibling();
+            await UniTask.DelayFrame(5);
+
+            btnClickEmptyClose.AddListener(()=>
             {
-                GameObject goBtnESC = GameObject.Instantiate(Resources.Load<GameObject>("Prefabs/ClickEmptyCloseMask"), transform);
-                //  Load
-                btnClickEmptyClose = goBtnESC.GetComponent<Button>();
-                btnClickEmptyClose.AddListener(CloseWindow);
-                btnClickEmptyClose.transform.SetAsFirstSibling();
-            }
+                if (btnClickEmptyCloseEvent != null)
+                {
+                    btnClickEmptyCloseEvent();
+                }
+                else
+                { 
+                    CloseWindow();
+                }
+            });
         }
     }
+
 
     protected async void ExecuteNextFrame(Action _action)
     {
@@ -171,8 +193,9 @@
 
         // 璁剧疆Canvas灞炴��
         canvas.overrideSorting = true;
-
         canvas.worldCamera = CameraManager.uiCamera;
+
+        canvas.sortingLayerID = SortingLayer.NameToID("UI"); // 纭繚浣跨敤姝g‘鐨勬帓搴忓眰
 
         // 鑾峰彇鎴栨坊鍔燙anvasGroup缁勪欢
         canvasGroup = GetComponent<CanvasGroup>();
@@ -188,9 +211,9 @@
         }
 
         canvasScaler = GetComponent<CanvasScaler>();
-
-        // 鑾峰彇RectTransform缁勪欢
-        rectTransform = GetComponent<RectTransform>();
+        canvasScaler.referenceResolution = Constants.DESIGN_RESOLUTION;
+        canvasScaler.uiScaleMode = CanvasScaler.ScaleMode.ScaleWithScreenSize;
+        canvasScaler.matchWidthOrHeight = 0;
     }
 
     // 鑾峰彇蹇呰鐨勭粍浠�
@@ -221,6 +244,12 @@
     // 鎵撳紑UI
     public void HandleOpen()
     {
+        if (_rectTransform == null)
+        {
+            Debug.LogError($"鐣岄潰: {uiName} 闇�瑕佽缃牴鑺傜偣_rectTransform ");
+            return;
+        }
+
         OnPreOpen();
         // 濡傛灉姝e湪鎾斁鍔ㄧ敾锛屽厛鍋滄
         StopCurrentAnimation();
@@ -233,8 +262,19 @@
 
         // 鏍规嵁鍔ㄧ敾绫诲瀷鎾斁鎵撳紑鍔ㄧ敾
         PlayOpenAnimation();
+        
+        // // 濡傛灉鍚庣画闇�瑕佺粺涓�澶勭悊鍒樻捣鎴栬�呭皬娓告垙鐨勭晫闈㈤�傞厤闂
+        // _rectTransform.offsetMin = new Vector2(0, 10);  //涓嬫柟
+        // _rectTransform.offsetMax = new Vector2(0, -50); //涓婃柟
 
         OnOpen();
+
+        ExecuteNextFrame(NextFrameAfterOpen);
+    }
+
+    protected virtual void NextFrameAfterOpen()
+    {
+
     }
 
     // 鍏抽棴UI - 淇敼鍚庣殑鏂规硶
@@ -255,7 +295,6 @@
         // 绂佺敤浜や簰浣嗕繚鎸佸彲瑙�
         if (canvasGroup != null)
         {
-            canvasGroup.interactable = false;
             canvasGroup.blocksRaycasts = false;
         }
 
@@ -314,148 +353,17 @@
     /// <summary>
     /// 鎾斁UI鐗规晥
     /// </summary>
-    /// <param name="effectName">鐗规晥璧勬簮鍚嶇О</param>
+    /// <param name="id">鐗规晥璧勬簮鍚嶇О</param>
     /// <param name="parent">鐗规晥鐖惰妭鐐癸紝榛樿涓哄綋鍓峌I</param>
-    /// <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 UIEffectPlayer PlayUIEffect(int id, Transform parent = null)
     {
         // 浣跨敤榛樿鍊�
         if (parent == null) parent = transform;
-        
-        EffectConfig effectCfg = EffectConfig.Get(id);
 
-        if (null == effectCfg)
-        {
-            return null;
-        }
-
-        // 鍔犺浇鐗规晥璧勬簮
-        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 UIEffectPlayer.CreateEffect(id, parent, false);
     }
     
-    /// <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
@@ -485,15 +393,13 @@
     // 鎾斁鎵撳紑鍔ㄧ敾
     protected virtual void PlayOpenAnimation()
     {
+
+
         if (openAnimationType == UIAnimationType.None)
         {
             // 鏃犲姩鐢伙紝鐩存帴鍚敤浜や簰
-            if (canvasGroup != null)
-            {
-                canvasGroup.alpha = 1f;
-                canvasGroup.interactable = true;
-                canvasGroup.blocksRaycasts = true;
-            }
+            //  鍒濆鍊艰瀹氬ソ
+            _ResetToBegin();
             return;
         }
 
@@ -506,77 +412,74 @@
                 if (canvasGroup != null)
                 {
                     canvasGroup.alpha = 0f;
-                    canvasGroup.interactable = false;
                     canvasGroup.blocksRaycasts = false;
+                }
+                if (_rectTransform != null)
+                {
+                    _rectTransform.localScale = Vector3.one;
                 }
                 break;
 
             case UIAnimationType.ScaleInOut:
-                if (rectTransform != null)
+                if (canvasGroup != null)
                 {
-                    canvasScaler.scaleFactor = 0.3f;
-                    canvasGroup.interactable = false;
+                    canvasGroup.alpha = 1f;
                     canvasGroup.blocksRaycasts = false;
+                }
+                if (_rectTransform != null)
+                {
+                    _rectTransform.localScale = Vector3.one * 0.3f;
                 }
                 break;
 
             case UIAnimationType.SlideFromTop:
-                if (rectTransform != null)
+                _ResetToBegin();
+                if (_rectTransform != null)
                 {
                     Vector2 startPos = originalPosition;
-                    startPos.y = Screen.height;
-                    rectTransform.anchoredPosition = startPos;
-                }
-                if (canvasGroup != null)
-                {
-                    canvasGroup.alpha = 0f;
-                    canvasGroup.interactable = false;
-                    canvasGroup.blocksRaycasts = false;
+                    startPos.y = originalPosition.y + Screen.height;
+                    _rectTransform.anchoredPosition = startPos;
                 }
                 break;
 
             case UIAnimationType.SlideFromBottom:
-                if (rectTransform != null)
+                _ResetToBegin();
+                if (_rectTransform != null)
                 {
                     Vector2 startPos = originalPosition;
-                    startPos.y = -Screen.height;
-                    rectTransform.anchoredPosition = startPos;
-                }
-                if (canvasGroup != null)
-                {
-                    canvasGroup.alpha = 0f;
-                    canvasGroup.interactable = false;
-                    canvasGroup.blocksRaycasts = false;
+                    startPos.y = originalPosition.y-Screen.height;
+                    _rectTransform.anchoredPosition = startPos;
                 }
                 break;
 
             case UIAnimationType.SlideFromLeft:
-                if (rectTransform != null)
+                _ResetToBegin();
+                if (_rectTransform != null)
                 {
                     Vector2 startPos = originalPosition;
-                    startPos.x = -Screen.width;
-                    rectTransform.anchoredPosition = startPos;
-                }
-                if (canvasGroup != null)
-                {
-                    canvasGroup.alpha = 0f;
-                    canvasGroup.interactable = false;
-                    canvasGroup.blocksRaycasts = false;
+                    startPos.x = originalPosition.x-Screen.width;
+                    _rectTransform.anchoredPosition = startPos;
                 }
                 break;
 
             case UIAnimationType.SlideFromRight:
-                if (rectTransform != null)
+                _ResetToBegin();
+                if (_rectTransform != null)
                 {
                     Vector2 startPos = originalPosition;
-                    startPos.x = Screen.width;
-                    rectTransform.anchoredPosition = startPos;
+                    startPos.x = originalPosition.x+Screen.width;
+                    _rectTransform.anchoredPosition = startPos;
                 }
+                break;
+            case UIAnimationType.ScaleOverInOut:
                 if (canvasGroup != null)
                 {
-                    canvasGroup.alpha = 0f;
-                    canvasGroup.interactable = false;
+                    canvasGroup.alpha = 1f;
                     canvasGroup.blocksRaycasts = false;
+                }
+                if (_rectTransform != null)
+                {
+                    _rectTransform.localScale = Vector3.one * 0.3f;
                 }
                 break;
         }
@@ -597,9 +500,9 @@
                     break;
 
                 case UIAnimationType.ScaleInOut:
-                    if (rectTransform != null)
+                    if (_rectTransform != null)
                     {
-                        currentAnimation.Append(DOVirtual.Float(0.3f, originalScale.x, animeDuration, (value) => {canvasScaler.scaleFactor = value;}).SetEase(animationEase));
+                        currentAnimation.Append(DOVirtual.Float(0.3f, 1f, animeDuration, (value) => {_rectTransform.localScale = Vector3.one * value;}).SetEase(animationEase));
                     }
                     break;
 
@@ -607,13 +510,27 @@
                 case UIAnimationType.SlideFromBottom:
                 case UIAnimationType.SlideFromLeft:
                 case UIAnimationType.SlideFromRight:
-                    if (rectTransform != null)
+                    if (_rectTransform != null)
                     {
-                        currentAnimation.Append(rectTransform.DOAnchorPos(originalPosition, animeDuration).SetEase(animationEase));
+                        currentAnimation.Append(_rectTransform.DOAnchorPos(originalPosition, animeDuration).SetEase(animationEase));
                     }
-                    if (canvasGroup != null)
+                    break;
+                case UIAnimationType.ScaleOverInOut:
+                    if (_rectTransform != null)
                     {
-                        currentAnimation.Join(canvasGroup.DOFade(1f, animeDuration).SetEase(animationEase));
+                        float startScale = scaleOverInOutCurve.curve.Evaluate(0f);
+                        _rectTransform.localScale = Vector3.one * startScale;
+                        currentAnimation.Append(
+                            DOTween.To(
+                                () => _rectTransform.localScale.x,
+                                (value) => _rectTransform.localScale = Vector3.one * value,
+                                1f, 
+                                animeDuration
+                            )
+                            .SetEase(scaleOverInOutCurve.curve)
+                            .OnComplete(() => _rectTransform.localScale = Vector3.one) // 纭繚鏈�缁堝��1姝g‘
+                        );
+                        
                     }
                     break;
             }
@@ -622,14 +539,18 @@
             currentAnimation.OnComplete(() =>
             {
                 isAnimating = false;
+                _ResetToBegin();
+                OnOpenAnimationComplete();
 
                 // 鍚敤浜や簰
                 if (canvasGroup != null)
                 {
-                    canvasGroup.interactable = true;
                     canvasGroup.blocksRaycasts = true;
                 }
+
             });
+
+            // currentAnimation.ingoreTimeScale = true;
 
             currentAnimation.Play();
         }
@@ -641,11 +562,38 @@
             if (canvasGroup != null)
             {
                 canvasGroup.alpha = 1f;
-                canvasGroup.interactable = true;
                 canvasGroup.blocksRaycasts = true;
             }
             isAnimating = false;
         }
+    }
+
+    // private void Update()
+    // {
+    //     Debug.LogError(_rectTransform.parent.name + ":" + _rectTransform.anchoredPosition);
+    // }
+
+    private void _ResetToBegin()
+    {
+        if (canvasGroup != null)
+        {
+            canvasGroup.alpha = 1f;
+            canvasGroup.blocksRaycasts = true;
+        }
+        if (_rectTransform != null)
+        {
+            _rectTransform.localScale = Vector3.one;
+        }
+
+        if (_rectTransform != null)
+        {
+            _rectTransform.anchoredPosition = originalPosition;
+        }
+    }
+
+    protected virtual void OnOpenAnimationComplete()
+    {
+
     }
 
     // 鎾斁鍏抽棴鍔ㄧ敾 - 淇敼鍚庣殑鏂规硶
@@ -670,66 +618,51 @@
                 case UIAnimationType.FadeInOut:
                     if (canvasGroup != null)
                     {
-                        currentAnimation.Append(canvasGroup.DOFade(0f, animeDuration).SetEase(animationEase));
+                        currentAnimation.Append(canvasGroup.DOFade(0.1f, animeDuration).SetEase(animationEase));
                     }
                     break;
 
                 case UIAnimationType.ScaleInOut:
-                    if (rectTransform != null)
+                case UIAnimationType.ScaleOverInOut:
+                    if (_rectTransform != null)
                     {
-                        currentAnimation.Append(DOVirtual.Float(originalScale.x, 0.3f, animeDuration, (value) => {canvasScaler.scaleFactor = value;}).SetEase(animationEase));
+                        currentAnimation.Append(DOVirtual.Float(1f, 0.3f, animeDuration, (value) => {_rectTransform.localScale = Vector3.one * value;}).SetEase(animationEase));
                     }
                     break;
 
                 case UIAnimationType.SlideFromTop:
-                    if (rectTransform != null)
+                    if (_rectTransform != null)
                     {
                         Vector2 endPos = originalPosition;
                         endPos.y = Screen.height;
-                        currentAnimation.Append(rectTransform.DOAnchorPos(endPos, animeDuration).SetEase(animationEase));
-                    }
-                    if (canvasGroup != null)
-                    {
-                        currentAnimation.Join(canvasGroup.DOFade(0f, animeDuration).SetEase(animationEase));
+                        currentAnimation.Append(_rectTransform.DOAnchorPos(endPos, animeDuration).SetEase(animationEase));
                     }
                     break;
 
                 case UIAnimationType.SlideFromBottom:
-                    if (rectTransform != null)
+                    if (_rectTransform != null)
                     {
                         Vector2 endPos = originalPosition;
                         endPos.y = -Screen.height;
-                        currentAnimation.Append(rectTransform.DOAnchorPos(endPos, animeDuration).SetEase(animationEase));
-                    }
-                    if (canvasGroup != null)
-                    {
-                        currentAnimation.Join(canvasGroup.DOFade(0f, animeDuration).SetEase(animationEase));
+                        currentAnimation.Append(_rectTransform.DOAnchorPos(endPos, animeDuration).SetEase(animationEase));
                     }
                     break;
 
                 case UIAnimationType.SlideFromLeft:
-                    if (rectTransform != null)
+                    if (_rectTransform != null)
                     {
                         Vector2 endPos = originalPosition;
                         endPos.x = -Screen.width;
-                        currentAnimation.Append(rectTransform.DOAnchorPos(endPos, animeDuration).SetEase(animationEase));
-                    }
-                    if (canvasGroup != null)
-                    {
-                        currentAnimation.Join(canvasGroup.DOFade(0f, animeDuration).SetEase(animationEase));
+                        currentAnimation.Append(_rectTransform.DOAnchorPos(endPos, animeDuration).SetEase(animationEase));
                     }
                     break;
 
                 case UIAnimationType.SlideFromRight:
-                    if (rectTransform != null)
+                    if (_rectTransform != null)
                     {
                         Vector2 endPos = originalPosition;
                         endPos.x = Screen.width;
-                        currentAnimation.Append(rectTransform.DOAnchorPos(endPos, animeDuration).SetEase(animationEase));
-                    }
-                    if (canvasGroup != null)
-                    {
-                        currentAnimation.Join(canvasGroup.DOFade(0f, animeDuration).SetEase(animationEase));
+                        currentAnimation.Append(_rectTransform.DOAnchorPos(endPos, animeDuration).SetEase(animationEase));
                     }
                     break;
             }

--
Gitblit v1.8.0