: IActivitySentry where TM : AEventDataManager where TD : IEventData ,new()
{
protected AActivitySentry()
{
var attribute = GetType().GetCustomAttribute();
if (attribute == null)
{
Debug.LogError($"{GetType().Name} must have ActivitySentryAttribute");
return;
}
EventType = attribute.EventType;
EventSubType = attribute.EventSubType;
}
public int EventType { get; }
public int EventSubType { get; }
public IHomeEntranceBtn HomeEntranceBtn { get; set; }
public FishingEvent CurrentEventConfig { get; set; }
public List RelatedEvents { get; set; }
protected bool IsActive { get; private set; } = false;
// DI 注入的依赖(用于替代静态方法调用)
protected ActivityScopeManager _scopeManager;
///
/// 由 ActivityManager 在创建 Sentry 时调用,注入依赖
///
public void InjectDependencies(ActivityScopeManager scopeManager )
{
_scopeManager = scopeManager;
}
///
/// 便捷方法:解析活动管理器
///
protected TM ResolveManager()
{
return _scopeManager.GetOrRegisterInstance((EventType, EventSubType));
}
///
/// 活动开启(由 Manager 调用)
///
public void Open(FishingEvent fishingEvent)
{
if (fishingEvent == null) return;
var previousEventConfig = CurrentEventConfig;
CurrentEventConfig = fishingEvent;
IsActive = true;
// 如果是切换到新活动,先调用切换钩子
if (previousEventConfig != fishingEvent)
OnEventChanged(previousEventConfig, fishingEvent);
// 调用激活钩子
OnEventActive(fishingEvent);
}
///
/// 活动关闭(由 Manager 调用)
///
public void Close(FishingEvent fishingEvent)
{
if (fishingEvent == null) return;
OnEventClosed(fishingEvent);
IsActive = false;
CurrentEventConfig =null;
}
public void RegisterHomeEntranceBtn(IHomeEntranceBtn homeEntranceBtn)
{
HomeEntranceBtn = homeEntranceBtn;
if(IsActive)
homeEntranceBtn?.OnOpen(CurrentEventConfig,ResolveManager());
}
public void UnregisterHomeEntranceBtn()
{
HomeEntranceBtn = null;
}
///
public virtual void OnActivityTokenBalanceChanged(int eventId)
{
if (!IsActive || CurrentEventConfig == null || CurrentEventConfig.ID != eventId)
return;
var manager = ResolveManager();
if (manager == null)
return;
if (manager is IActivityEventRedPoint| red)
{
try
{
red.SetRedPoint(manager.LoadData());
}
catch (Exception e)
{
Debug.LogError($"[{GetType().Name}] SetRedPoint after token balance change failed: {e.Message}");
}
}
}
#region 生命周期钩子
///
/// 活动切换时调用
///
protected virtual void OnEventChanged(FishingEvent previousEventConfig, FishingEvent newEventConfig)
{
if(newEventConfig==null) return;
ResolveManager()?.RefreshData(newEventConfig);
}
///
/// 活动激活时调用
///
protected virtual void OnEventActive(FishingEvent fishingEvent)
{
// 活动开启时注册到 OrderManager
var manager = ResolveManager();
if (manager is IOrderReplenishment repl)
OrderManager.OrderManager.RegisterReplenishment(repl);
if (manager is IOrderSuccess succ)
OrderManager.OrderManager.RegisterOrderSuccess(succ);
//todo 这里通知homepanle 实例化 homeEntranceBtn prefab,
HomeEntranceBtn?.OnOpen(fishingEvent, manager);
}
///
/// 活动关闭时调用
///
protected virtual void OnEventClosed(FishingEvent fishingEvent)
{
// 活动关闭时取消注册
var manager = ResolveManager();
if (manager is IOrderReplenishment repl)
OrderManager.OrderManager.UnregisterReplenishment(repl);
if (manager is IOrderSuccess succ)
OrderManager.OrderManager.UnregisterOrderSuccess(succ);
// 通知按钮活动关闭
HomeEntranceBtn?.OnClose(fishingEvent);
}
#endregion
#region IDisposable
public virtual void Dispose()
{
if (!IsActive) return;
Close(CurrentEventConfig);
}
#endregion
}
}
| |