From b7bad9b52d93aec7fe16d2b086af927a44533dee Mon Sep 17 00:00:00 2001
From: lcy <1459594991@qq.com>
Date: 星期二, 28 十月 2025 14:39:38 +0800
Subject: [PATCH] 143 挑战按钮逻辑优化,方便后续接入

---
 Main/System/ChallengeTab/ArenaTabHandler.cs              |   65 +++++++
 Main/System/ChallengeTab/ArenaTabHandler.cs.meta         |   11 +
 Main/System/ChallengeTab/BoneFieldTabHandler.cs.meta     |   11 +
 Main/System/ChallengeTab/BaseChallengeTabHandler.cs      |  108 ++++++++++++
 Main/System/ChallengeTab/ChallengeTabWin.cs              |  140 ++-------------
 Main/System/ChallengeTab/ChallengeTabButton.cs           |   88 +++++++--
 Main/System/ChallengeTab/BoneFieldTabHandler.cs          |   78 ++++++++
 Main/System/ChallengeTab/BaseChallengeTabHandler.cs.meta |   11 +
 8 files changed, 367 insertions(+), 145 deletions(-)

diff --git a/Main/System/ChallengeTab/ArenaTabHandler.cs b/Main/System/ChallengeTab/ArenaTabHandler.cs
new file mode 100644
index 0000000..5f26cc4
--- /dev/null
+++ b/Main/System/ChallengeTab/ArenaTabHandler.cs
@@ -0,0 +1,65 @@
+using System;
+using UnityEngine;
+
+public class ArenaTabHandler : BaseChallengeTabHandler
+{
+    protected override int GetIndex() => 1;
+    protected override int GetOpenState() => 0; // 0=FuncID
+    protected override int GetFuncId() => ArenaManager.Instance.funcId;
+    protected override int GetRedpointId() => MainRedDot.ArenaRepoint;
+
+    protected override string GetCountInfo()
+    {
+        long nowCount = UIHelper.GetMoneyCnt(ArenaManager.Instance.ChallengeMoneyType);
+        return UIHelper.AppendColor(nowCount > 0 ? TextColType.Green : TextColType.Red, Language.Get("Challenge03", nowCount));
+    }
+
+    protected override Action GetOnClickAction()
+    {
+        return HandleArenaNavigation;
+    }
+
+    private void HandleArenaNavigation()
+    {
+        if (!FuncOpen.Instance.IsFuncOpen(GetFuncId(), true))
+            return;
+
+        BattleField arenaBattle = BattleManager.Instance.GetBattleFieldByMapID(3);
+        if (arenaBattle != null)
+        {
+            ArenaBattleWin battleWin;
+            if (!UIManager.Instance.IsOpened<ArenaBattleWin>())
+            {
+                battleWin = UIManager.Instance.OpenWindow<ArenaBattleWin>();
+            }
+            else
+            {
+                battleWin = UIManager.Instance.GetUI<ArenaBattleWin>();
+            }
+            battleWin.SetBattleField(arenaBattle);
+        }
+        else
+        {
+            UIManager.Instance.OpenWindow<ArenaWin>();
+        }
+    }
+
+    protected override void SubscribeToSpecificEvents()
+    {
+        PlayerDatas.Instance.playerDataRefreshEvent += OnPlayerDataRefresh;
+    }
+
+    protected override void UnsubscribeFromSpecificEvents()
+    {
+        PlayerDatas.Instance.playerDataRefreshEvent -= OnPlayerDataRefresh;
+    }
+
+    private void OnPlayerDataRefresh(PlayerDataType type)
+    {
+        if (type == PlayerDataType.ChallengeVoucher)
+        {
+            Refresh();
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/Main/System/ChallengeTab/ArenaTabHandler.cs.meta b/Main/System/ChallengeTab/ArenaTabHandler.cs.meta
new file mode 100644
index 0000000..cfd71ed
--- /dev/null
+++ b/Main/System/ChallengeTab/ArenaTabHandler.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: e08213d7902819944bd303758458714a
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/ChallengeTab/BaseChallengeTabHandler.cs b/Main/System/ChallengeTab/BaseChallengeTabHandler.cs
new file mode 100644
index 0000000..04b67b8
--- /dev/null
+++ b/Main/System/ChallengeTab/BaseChallengeTabHandler.cs
@@ -0,0 +1,108 @@
+using System;
+using UnityEngine;
+
+/// <summary>
+/// 鎸戞垬鏍囩椤垫寜閽殑閫昏緫澶勭悊鍩虹被
+/// 鎸傚湪涓� ChallengeTabButton 鍚屼竴涓狦ameObject涓�
+/// </summary>
+[RequireComponent(typeof(ChallengeTabButton))]
+public abstract class BaseChallengeTabHandler : MonoBehaviour
+{
+    protected ChallengeTabButton tabButton;
+    private ChallengeTabButton.DisplayData displayData;
+
+    protected virtual void Awake()
+    {
+        tabButton = GetComponent<ChallengeTabButton>();
+        // 鍒濆鍖栦竴娆� DisplayData锛屼箣鍚庡彧淇敼鍙樺寲鐨勫瓧娈�
+        displayData = new ChallengeTabButton.DisplayData
+        {
+            Index = GetIndex(),
+            RedpointId = GetRedpointId(),
+            OpenState = GetOpenState(),
+            FuncId = GetFuncId(),
+            OnClickAction = GetOnClickAction()
+        };
+    }
+
+    /// <summary>
+    /// 璁㈤槄浜嬩欢 (鐢� ChallengeTabWin 鍦� OnPreOpen 鏃惰皟鐢�)
+    /// </summary>
+    public virtual void SubscribeEvents()
+    {
+        // 璁㈤槄鍏ㄥ眬鍒锋柊浜嬩欢
+        TimeMgr.Instance.OnDayEvent += Refresh;
+        FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChange;
+        // 璁㈤槄姝ゆ寜閽壒瀹氱殑浜嬩欢
+        SubscribeToSpecificEvents();
+    }
+
+    /// <summary>
+    /// 鍙栨秷璁㈤槄浜嬩欢 (鐢� ChallengeTabWin 鍦� OnPreClose 鏃惰皟鐢�)
+    /// </summary>
+    public virtual void UnsubscribeEvents()
+    {
+        TimeMgr.Instance.OnDayEvent -= Refresh;
+        FuncOpen.Instance.OnFuncStateChangeEvent -= OnFuncStateChange;
+        UnsubscribeFromSpecificEvents();
+    }
+
+    /// <summary>
+    /// 鍒锋柊UI鏄剧ず (鐢� ChallengeTabWin 鎴栦簨浠跺洖璋冭皟鐢�)
+    /// </summary>
+    public void Refresh()
+    {
+        if (tabButton == null)
+            return;
+        displayData.CountInfo = GetCountInfo();
+        tabButton.Display(displayData);
+    }
+
+    private void OnFuncStateChange(int funcId)
+    {
+        if (GetOpenState() == 0 && funcId == GetFuncId())
+        {
+            Refresh();
+        }
+    }
+
+    /// <summary>
+    /// 鑾峰彇Tab鐨勭储寮曪紙鐢ㄤ簬Icon鍜孨ame锛�
+    /// </summary>
+    protected abstract int GetIndex();
+
+    /// <summary>
+    /// 鑾峰彇寮�鍚柟寮� (0=FuncID, 1=娲诲姩)
+    /// </summary>
+    protected abstract int GetOpenState();
+
+    /// <summary>
+    /// 鑾峰彇鍔熻兘ID
+    /// </summary>
+    protected abstract int GetFuncId();
+
+    /// <summary>
+    /// 鑾峰彇绾㈢偣ID
+    /// </summary>
+    protected abstract int GetRedpointId();
+
+    /// <summary>
+    /// 鑾峰彇鏁伴噺鐨勬樉绀烘枃鏈�
+    /// </summary>
+    protected abstract string GetCountInfo();
+
+    /// <summary>
+    /// 鑾峰彇鎸夐挳鐐瑰嚮鏃惰Е鍙戠殑 *鍏蜂綋* 涓氬姟閫昏緫
+    /// </summary>
+    protected abstract Action GetOnClickAction();
+
+    /// <summary>
+    /// 璁㈤槄姝ab鐗规湁鐨勪簨浠�
+    /// </summary>
+    protected abstract void SubscribeToSpecificEvents();
+
+    /// <summary>
+    /// 鍙栨秷璁㈤槄姝ab鐗规湁鐨勪簨浠�
+    /// </summary>
+    protected abstract void UnsubscribeFromSpecificEvents();
+}
\ No newline at end of file
diff --git a/Main/System/ChallengeTab/BaseChallengeTabHandler.cs.meta b/Main/System/ChallengeTab/BaseChallengeTabHandler.cs.meta
new file mode 100644
index 0000000..e384123
--- /dev/null
+++ b/Main/System/ChallengeTab/BaseChallengeTabHandler.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 91477a81b5997714db36457077d03ac4
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/ChallengeTab/BoneFieldTabHandler.cs b/Main/System/ChallengeTab/BoneFieldTabHandler.cs
new file mode 100644
index 0000000..f67644e
--- /dev/null
+++ b/Main/System/ChallengeTab/BoneFieldTabHandler.cs
@@ -0,0 +1,78 @@
+using System;
+using UnityEngine;
+
+public class BoneFieldTabHandler : BaseChallengeTabHandler
+{
+    protected override int GetIndex() => 2;
+    protected override int GetOpenState() => 0; // 0=FuncID
+    protected override int GetFuncId() => BoneFieldManager.Instance.funcId;
+    protected override int GetRedpointId() => MainRedDot.BoneFieldRepoint;
+
+    protected override string GetCountInfo()
+    {
+        if (BoneFieldManager.Instance.TryGetShowSweepCount(out int _, out int showrealRemainSweepCount))
+        {
+            return UIHelper.AppendColor(showrealRemainSweepCount > 0 ? TextColType.Green : TextColType.Red, Language.Get("Challenge01", showrealRemainSweepCount));
+        }
+        return string.Empty; // 鑾峰彇澶辫触鏃惰繑鍥炵┖
+    }
+
+    protected override Action GetOnClickAction()
+    {
+        return HandleBoneFieldNavigation;
+    }
+
+    private void HandleBoneFieldNavigation()
+    {
+        if (!FuncOpen.Instance.IsFuncOpen(GetFuncId(), true))
+            return;
+
+        BattleField battleField = BattleManager.Instance.GetBattleFieldByMapID(30010);
+        if (battleField != null)
+        {
+            BoneFieldBattleWin battleWin;
+            if (!UIManager.Instance.IsOpened<BoneFieldBattleWin>())
+            {
+                battleWin = UIManager.Instance.OpenWindow<BoneFieldBattleWin>();
+            }
+            else
+            {
+                battleWin = UIManager.Instance.GetUI<BoneFieldBattleWin>();
+            }
+            battleWin.SetBattleField(battleField as BoneBattleField);
+        }
+        else
+        {
+            UIManager.Instance.OpenWindow<BoneFieldWin>();
+        }
+    }
+
+    protected override void SubscribeToSpecificEvents()
+    {
+
+        DungeonManager.Instance.UpdateFBInfoChangeEvent += OnUpdateFBInfoChange;
+        AdsManager.Instance.OnAdsInfoListUpdateEvent += OnAdsInfoListUpdate;
+    }
+
+    protected override void UnsubscribeFromSpecificEvents()
+    {
+        DungeonManager.Instance.UpdateFBInfoChangeEvent -= OnUpdateFBInfoChange;
+        AdsManager.Instance.OnAdsInfoListUpdateEvent -= OnAdsInfoListUpdate;
+    }
+
+    private void OnUpdateFBInfoChange(int mapID, bool isADAddCntChange, bool isBuyAddCntChange, bool isItemAddCntChange)
+    {
+        if (mapID == BoneFieldManager.Instance.DataMapID)
+        {
+            Refresh();
+        }
+    }
+
+    private void OnAdsInfoListUpdate(int adID, int mapID)
+    {
+        if (mapID == BoneFieldManager.Instance.DataMapID)
+        {
+            Refresh();
+        }
+    }
+}
\ No newline at end of file
diff --git a/Main/System/ChallengeTab/BoneFieldTabHandler.cs.meta b/Main/System/ChallengeTab/BoneFieldTabHandler.cs.meta
new file mode 100644
index 0000000..5b860e0
--- /dev/null
+++ b/Main/System/ChallengeTab/BoneFieldTabHandler.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: bc6f3e382ad10c048af48f137e2f9569
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/ChallengeTab/ChallengeTabButton.cs b/Main/System/ChallengeTab/ChallengeTabButton.cs
index 38ac43f..d309c3d 100644
--- a/Main/System/ChallengeTab/ChallengeTabButton.cs
+++ b/Main/System/ChallengeTab/ChallengeTabButton.cs
@@ -11,31 +11,73 @@
     [SerializeField] TextEx txtLockInfo;
     [SerializeField] Transform transUnlock;
     [SerializeField] RedpointBehaviour redpointBehaviour;
-    Action action;
-    void Awake()
+
+    private Action _onClickAction;
+
+    public struct DisplayData
     {
-        btnTab.SetListener(() =>
-        {
-            UIManager.Instance.CloseWindow<ChallengeTabWin>();
-            string activeBattleName = BattleManager.Instance.GetActiveBattleName();
-            if (activeBattleName != "" && activeBattleName != "StoryBattleField")
-            {
-                UIManager.Instance.GetUI<MainWin>().ClickFunc(0);
-            }
-            action?.Invoke();
-        });
+        public int Index;
+        public int RedpointId;
+        public int OpenState;//0 FuncID 1 娲诲姩
+        public int FuncId;
+        public string CountInfo;
+        public Action OnClickAction; // 鎸夐挳鐐瑰嚮鏃惰Е鍙戠殑鍏蜂綋閫昏緫
     }
 
-    public void Display(int index, int redpointId, bool isLock, string countInfo, string lockInfo, Action action)
+    void Awake()
     {
-        redpointBehaviour.redpointId = redpointId;
-        transUnlock.SetActive(!isLock);
-        txtCount.SetActive(isLock);
-        txtLockInfo.SetActive(!isLock);
-        imgIcon.SetSprite(StringUtility.Contact("ChallengeTab", index));
-        txtName.text = Language.Get(StringUtility.Contact("ChallengeTab", index));
-        txtCount.text = countInfo;
-        txtLockInfo.text = lockInfo;
-        this.action = action;
+        btnTab.SetListener(OnTabClicked);
     }
-}
+
+    /// <summary>
+    /// 澶勭悊鎸夐挳鐐瑰嚮浜嬩欢
+    /// </summary>
+    private void OnTabClicked()
+    {
+        // --- 閫氱敤鐐瑰嚮閫昏緫 ---
+        UIManager.Instance.CloseWindow<ChallengeTabWin>();
+        string activeBattleName = BattleManager.Instance.GetActiveBattleName();
+        if (activeBattleName != "" && activeBattleName != "StoryBattleField")
+        {
+            UIManager.Instance.GetUI<MainWin>().ClickFunc(0);
+        }
+        // 鎵ц浼犲叆鐨勫叿浣撲笟鍔¢�昏緫
+        _onClickAction?.Invoke();
+    }
+
+    /// <summary>
+    /// 浣跨敤 DisplayData 缁撴瀯浣撴潵鏇存柊鎸夐挳鏄剧ず
+    /// </summary>
+    /// <param name="data">鍖呭惈鎵�鏈夋樉绀哄拰琛屼负閰嶇疆鐨勬暟鎹�</param>
+    public void Display(DisplayData data)
+    {
+        redpointBehaviour.redpointId = data.RedpointId;
+
+        bool isOpen;
+        if (data.OpenState == 0)
+        {
+            isOpen = FuncOpen.Instance.IsFuncOpen(data.FuncId);
+        }
+        else
+        {
+            isOpen = false;
+        }
+
+        // 鏍规嵁閿佸畾鐘舵�佽缃樉闅�
+        transUnlock.SetActive(!isOpen);
+        txtCount.SetActive(isOpen);
+        txtLockInfo.SetActive(!isOpen);
+
+        // 璁剧疆鍥炬爣鍜屽悕绉�
+        string spriteAndLangKey = StringUtility.Contact("ChallengeTab", data.Index);
+        imgIcon.SetSprite(spriteAndLangKey);
+        txtName.text = Language.Get(spriteAndLangKey);
+
+        // 璁剧疆TIPS鏂囨湰
+        txtCount.text = data.CountInfo;
+        txtLockInfo.text = !isOpen ? Language.Get("Challenge02") : string.Empty;
+
+        // 瀛樺偍鐐瑰嚮鍥炶皟
+        this._onClickAction = data.OnClickAction;
+    }
+}
\ No newline at end of file
diff --git a/Main/System/ChallengeTab/ChallengeTabWin.cs b/Main/System/ChallengeTab/ChallengeTabWin.cs
index 0fc7804..67db7d6 100644
--- a/Main/System/ChallengeTab/ChallengeTabWin.cs
+++ b/Main/System/ChallengeTab/ChallengeTabWin.cs
@@ -3,146 +3,42 @@
 
 public class ChallengeTabWin : UIBase
 {
-    [SerializeField] ChallengeTabButton btnBoneField;
-    [SerializeField] ChallengeTabButton btnArena;
+    private BaseChallengeTabHandler[] tabHandlers;
 
     protected override void InitComponent()
     {
         base.InitComponent();
+        // 鑷姩鏌ユ壘鎵�鏈夊瓙瀵硅薄涓婄殑 Handler 缁勪欢
+        tabHandlers = GetComponentsInChildren<BaseChallengeTabHandler>(true);
     }
+
     protected override void OnPreOpen()
     {
         base.OnPreOpen();
-        DungeonManager.Instance.UpdateFBInfoChangeEvent += OnUpdateFBInfoChangeEvent;
-        AdsManager.Instance.OnAdsInfoListUpdateEvent += OnAdsInfoListUpdateEvent;
-        TimeMgr.Instance.OnDayEvent += OnDayEvent;
-        FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChangeEvent;
-        PlayerDatas.Instance.playerDataRefreshEvent += PlayerDataRefresh;
+        foreach (var handler in tabHandlers)
+        {
+            handler.SubscribeEvents();
+        }
         Display();
     }
+
     protected override void OnPreClose()
     {
         base.OnPreClose();
-        DungeonManager.Instance.UpdateFBInfoChangeEvent -= OnUpdateFBInfoChangeEvent;
-        AdsManager.Instance.OnAdsInfoListUpdateEvent -= OnAdsInfoListUpdateEvent;
-        TimeMgr.Instance.OnDayEvent -= OnDayEvent;
-        FuncOpen.Instance.OnFuncStateChangeEvent -= OnFuncStateChangeEvent;
-        PlayerDatas.Instance.playerDataRefreshEvent -= PlayerDataRefresh;
+        foreach (var handler in tabHandlers)
+        {
+            handler.UnsubscribeEvents();
+        }
         UIManager.Instance.GetUI<MainWin>()?.RestoreFuncBtn();
-    }
-    private void OnDayEvent()
-    {
-        Display();
-    }
-
-    private void OnAdsInfoListUpdateEvent(int id, int mapId)
-    {
-        Display();
-    }
-
-    private void OnUpdateFBInfoChangeEvent(int arg1, bool arg2, bool arg3, bool arg4)
-    {
-        if (arg1 == BoneFieldManager.Instance.DataMapID)
-        {
-            DisplayBoneFieldButton();
-        }
-
-    }
-
-    public void OnFuncStateChangeEvent(int funcId)
-    {
-        if (funcId == BoneFieldManager.Instance.funcId)
-        {
-            DisplayBoneFieldButton();
-        }
-        else if (funcId == ArenaManager.Instance.funcId)
-        {
-            DisplayArenaButton();
-        }
-    }
-
-    private void PlayerDataRefresh(PlayerDataType type)
-    {
-        if (type == PlayerDataType.ChallengeVoucher)
-        {
-            DisplayArenaButton();
-        }
     }
 
     public void Display()
     {
-        DisplayBoneFieldButton();
-        DisplayArenaButton();
-    }
-
-    public void DisplayArenaButton()
-    {
-        int index = 1;
-        int funcId = ArenaManager.Instance.funcId;
-        int redpointId = MainRedDot.ArenaRepoint;
-        bool isLock = FuncOpen.Instance.IsFuncOpen(funcId);
-        int type = ArenaManager.Instance.ChallengeMoneyType;
-        long nowCount = UIHelper.GetMoneyCnt(type);
-        string countInfo = UIHelper.AppendColor(nowCount > 0 ? TextColType.Green : TextColType.Red, Language.Get("Challenge03", nowCount));
-        string lockInfo = !isLock ? Language.Get("Challenge02") : string.Empty;
-        btnArena.Display(index, redpointId, isLock, countInfo, lockInfo, () =>
-        {
-            if (!FuncOpen.Instance.IsFuncOpen(funcId, true))
-                return;
-            BattleField arenaBattle = BattleManager.Instance.GetBattleFieldByMapID(3);
-            if (arenaBattle != null)
-            {
-                ArenaBattleWin battleWin;
-                if (!UIManager.Instance.IsOpened<ArenaBattleWin>())
-                {
-                    battleWin = UIManager.Instance.OpenWindow<ArenaBattleWin>();
-                }
-                else
-                {
-                    battleWin = UIManager.Instance.GetUI<ArenaBattleWin>();
-                }
-                battleWin.SetBattleField(arenaBattle);
-            }
-            else
-            {
-                UIManager.Instance.OpenWindow<ArenaWin>();
-            }
-        });
-    }
-
-    public void DisplayBoneFieldButton()
-    {
-        int index = 2;
-        int funcId = BoneFieldManager.Instance.funcId;
-        int redpointId = MainRedDot.BoneFieldRepoint;
-        bool isLock = FuncOpen.Instance.IsFuncOpen(funcId);
-        if (!BoneFieldManager.Instance.TryGetShowSweepCount(out int showSweepMaxCount, out int showrealRemainSweepCount))
+        if (tabHandlers == null)
             return;
-        string countInfo = UIHelper.AppendColor(showrealRemainSweepCount > 0 ? TextColType.Green : TextColType.Red, Language.Get("Challenge01", showrealRemainSweepCount));
-        string lockInfo = !isLock ? Language.Get("Challenge02") : string.Empty;
-        btnBoneField.Display(index, redpointId, isLock, countInfo, lockInfo, () =>
+        foreach (var handler in tabHandlers)
         {
-            if (!FuncOpen.Instance.IsFuncOpen(funcId, true))
-                return;
-            BattleField battleField = BattleManager.Instance.GetBattleFieldByMapID(30010);
-            if (battleField != null)
-            {
-                BoneFieldBattleWin battleWin;
-                if (!UIManager.Instance.IsOpened<BoneFieldBattleWin>())
-                {
-                    battleWin = UIManager.Instance.OpenWindow<BoneFieldBattleWin>();
-                }
-                else
-                {
-                    battleWin = UIManager.Instance.GetUI<BoneFieldBattleWin>();
-                }
-                battleWin.SetBattleField(battleField as BoneBattleField);
-            }
-            else
-            {
-                UIManager.Instance.OpenWindow<BoneFieldWin>();
-            }
-        });
+            handler.Refresh();
+        }
     }
-
-}
+}
\ No newline at end of file

--
Gitblit v1.8.0