using System;
using UnityEngine;
///
/// 挑战标签页按钮的逻辑处理基类
/// 挂在与 ChallengeTabButton 同一个GameObject上
///
[RequireComponent(typeof(ChallengeTabButton))]
public abstract class BaseChallengeTabHandler : MonoBehaviour
{
protected ChallengeTabButton tabButton;
private ChallengeTabButton.DisplayData displayData;
protected virtual void Awake()
{
tabButton = GetComponent();
// 初始化一次 DisplayData,之后只修改变化的字段
displayData = new ChallengeTabButton.DisplayData
{
Index = GetIndex(),
RedpointId = GetRedpointId(),
OpenState = GetOpenState(),
FuncId = GetFuncId(),
OnClickAction = GetOnClickAction()
};
}
///
/// 订阅事件 (由 ChallengeTabWin 在 OnPreOpen 时调用)
///
public virtual void SubscribeEvents()
{
// 订阅全局刷新事件
TimeMgr.Instance.OnDayEvent += Refresh;
FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChange;
// 订阅此按钮特定的事件
SubscribeToSpecificEvents();
}
///
/// 取消订阅事件 (由 ChallengeTabWin 在 OnPreClose 时调用)
///
public virtual void UnsubscribeEvents()
{
TimeMgr.Instance.OnDayEvent -= Refresh;
FuncOpen.Instance.OnFuncStateChangeEvent -= OnFuncStateChange;
UnsubscribeFromSpecificEvents();
}
///
/// 刷新UI显示 (由 ChallengeTabWin 或事件回调调用)
///
public void Refresh()
{
if (tabButton == null)
return;
displayData.CountInfo = GetCountInfo();
tabButton.Display(displayData);
}
private void OnFuncStateChange(int funcId)
{
if (GetOpenState() == 0 && funcId == GetFuncId())
{
Refresh();
}
}
///
/// 获取Tab的索引(用于Icon和Name)
///
protected abstract int GetIndex();
///
/// 获取开启方式 (0=FuncID, 1=活动)
///
protected abstract int GetOpenState();
///
/// 获取功能ID
///
protected abstract int GetFuncId();
///
/// 获取红点ID
///
protected abstract int GetRedpointId();
///
/// 获取数量的显示文本
///
protected abstract string GetCountInfo();
///
/// 获取按钮点击时触发的 *具体* 业务逻辑
///
protected abstract Action GetOnClickAction();
///
/// 订阅此Tab特有的事件
///
protected abstract void SubscribeToSpecificEvents();
///
/// 取消订阅此Tab特有的事件
///
protected abstract void UnsubscribeFromSpecificEvents();
}