NoticeManager
Coding Style wiki
NoticeManager 是 NoticeSystem 的靜態通知管理器 (紅點系統核心),負責通知條件 (NoticeCondition) 的註冊與條件 ID 查詢,並於數據變更時透過 Notify 依條件 ID 查找持有條件的 NoticeItem 進行刷新顯示。
| 命名空間 | OxGKit.NoticeSystem |
| 類型 | public static class NoticeManager |
| 原始碼 | NoticeManager.cs |
using OxGKit.NoticeSystem;
快速上手
using OxGKit.NoticeSystem;
// 1. 註冊通知條件 (啟動時註冊一次)
NoticeManager.RegisterCondition<NewMailCond>();
// 2. NoticeItem 註冊條件與數據 (透過條件 ID + 數據)
this.mailNoticeItem.RegisterNotice(new NoticeInfo(NewMailCond.id, this._mailBox));
// 3. 數據變更時,通知條件 ID 刷新紅點顯示
this._mailBox.unreadCount++;
NoticeManager.Notify(NewMailCond.id);
通用規則
條件 ID
- 條件 ID 於 RegisterCondition 註冊時自動分配 (以條件類型作為唯一鍵)。
- 慣例上於條件類中定義靜態屬性
id,透過 GetConditionId 取得:
public class NewMailCond : NoticeCondition
{
public static int id { get { return NoticeManager.GetConditionId<NewMailCond>(); } }
public override bool ShowCondition(object data) { /* ... */ }
}
重要 必須先 RegisterCondition 註冊條件,才能透過 GetConditionId 取得條件 ID (未註冊時回傳 0)。
通知刷新流程
- 數據狀態變更。
- 呼叫 Notify 通知條件 ID。
- NoticeManager 依條件 ID 查找持有該條件的所有 NoticeItem。
- 各 NoticeItem 重新進行條件檢查 (
ShowCondition),任一條件符合則顯示、皆不符合則隱藏。
提醒 Notify 過程會自動剔除已銷毀 (Destroyed) 的 NoticeItem 註冊,無需擔心殘留引用。
方法總覽
| 方法 | 說明 |
|---|---|
| RegisterCondition | 註冊通知條件 (自動分配條件 ID)。 |
| GetConditionId | 取得通知條件 ID。 |
| Notify | 數據變更時,依條件 ID 或 NoticeItem 通知刷新顯示。 |
RegisterCondition
public static void RegisterCondition<TNoticeCondition>() where TNoticeCondition : NoticeCondition, new()
註冊通知條件 (建立條件實例並自動分配條件 ID),支援於運行時動態新增條件。
NoticeManager.RegisterCondition<NewMailCond>();
NoticeManager.RegisterCondition<CoinInWalletCond>();
注意 重複註冊同一條件會被忽略,並輸出警告日誌。
GetConditionId
public static int GetConditionId<TNoticeCondition>() where TNoticeCondition : NoticeCondition
取得通知條件的條件 ID。
int conditionId = NoticeManager.GetConditionId<NewMailCond>();
注意 條件尚未註冊時回傳 0,需先透過 RegisterCondition 進行註冊。
Notify
// 單一條件 ID (non-alloc)
public static void Notify(int conditionId)
// 多個條件 ID
public static void Notify(params int[] conditionIds)
// 依 NoticeItem 通知 (自動收集其持有條件 ID 並剔除重複)
public static void Notify(params NoticeItem[] noticeItems)
數據變更時進行通知,將依條件 ID 查找持有條件的所有 NoticeItem 進行條件檢查與刷新顯示。
- 依條件 ID 通知:直接指定條件 ID (單一條件 ID 版本為 non-alloc,效率最好)。
- 依 NoticeItem 通知:自動收集傳入 NoticeItem 持有的條件 ID,剔除重複後再統一通知 (避免同條件重複刷新)。
// 數據變更
this._wallet.IncreaseCoin();
// 單一條件 ID (non-alloc)
NoticeManager.Notify(CoinInWalletCond.id);
// 多個條件 ID
NoticeManager.Notify(CoinInWalletCond.id, CoinIsEvenCond.id);
// 依 NoticeItem 通知
NoticeManager.Notify(this.walletNoticeItem, this.coinNoticeItem);
重要 數據變更後必須 Notify 相關條件 ID,紅點顯示才會刷新;若使用數值類型 (Value Type) 數據,需先透過 NoticeItem.RenewNotice 更新數據快照再 Notify。
注意 Notify 傳入未註冊的條件 ID 時,會輸出錯誤日誌 (Error Notice Condition Cannot find)。