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