模塊介紹
Coding Style wiki
基本說明
通知系統 (也稱紅點系統),支援動態新增刪除通知條件,可以自定義通知條件,再針對 NoticeItem 進行條件持有註冊,當 NoticeItem 身上持有的任一條件符合時,則通知顯示圖示 (紅點)。
- 版本:v1.0.5 (
com.michaelo.oxgkit.noticesystem) - 命名空間:
OxGKit.NoticeSystem
注意 本模組依賴 LoggingSystem 作為日誌輸出,需先安裝 OxGKit.LoggingSystem。
應用說明
實作通知條件
透過 Right-Click Create/OxGKit/Notice System/Template Notice Condition.cs 實作通知條件,共有以下模板:
- Template Notice Condition Registers.cs (Manually):條件註冊器模板 (靜態類),可集中註冊所有通知條件。
- Template Notice Condition.cs (Manually):通知條件模板,需自行透過
NoticeManager.RegisterCondition<T>()進行註冊。 - Template Notice Condition.cs (RuntimeInitializeLoadType.BeforeSceneLoad):通知條件模板,會於場景載入前自動註冊條件。
NoticeItem 條件註冊
- 將 NoticeItem prefab 拖曳至 UI 上,自行指定 ICON,再取得 NoticeItem 身上的組件進行條件註冊。
- 透過 Package Manager -> Samples 匯入 NoticeItem Prefab。
注意 當 NoticeItem OnDestroy 時,會自動進行 Deregister (註銷自身持有條件)。
數據變更通知
- 當有數據狀態變更時,必須通知特定條件 ID 進行 Notify,將會透過條件 ID 進行查找持有的 NoticeItems,並且進行刷新顯示。
重要 數據變更後必須 Notify 相關條件 ID,紅點顯示才會刷新。
簡單使用
實作通知條件
繼承 NoticeCondition 並實作 ShowCondition 條件判斷 (慣例上定義靜態屬性 id 取得自動分配的條件 ID):
using OxGKit.NoticeSystem;
public class NewMailCond : NoticeCondition
{
#region Default
public static int id { get { return NoticeManager.GetConditionId<NewMailCond>(); } }
#endregion
public override bool ShowCondition(object data)
{
if (data != null)
{
MailBox mailBox = data as MailBox;
// 有未讀郵件則顯示紅點
if (mailBox.unreadCount > 0) return true;
}
return false;
}
}
註冊通知條件
透過條件註冊器 (靜態類) 集中註冊,並於遊戲入口手動觸發靜態建構子:
using OxGKit.NoticeSystem;
public static class NoticeConditionRegister
{
static NoticeConditionRegister()
{
NoticeManager.RegisterCondition<NewMailCond>();
NoticeManager.RegisterCondition<CoinInWalletCond>();
}
/// <summary>
/// Manually trigger static constructor
/// </summary>
public static void Init() { }
}
private void Awake()
{
// 手動觸發靜態建構子完成條件註冊
NoticeConditionRegister.Init();
}
提醒 亦可使用 RuntimeInitializeLoadType.BeforeSceneLoad 模板,於場景載入前自動註冊條件。
NoticeItem 註冊條件
取得 NoticeItem 組件後,以 NoticeInfo (條件 ID + 數據) 進行條件註冊 (註冊時會自動檢查條件並刷新顯示):
using OxGKit.NoticeSystem;
public NoticeItem mailNoticeItem;
private MailBox _mailBox = new MailBox();
private void Awake()
{
// 單一 NoticeItem 可持有多個條件 (任一條件符合即顯示紅點)
this.mailNoticeItem.RegisterNotice
(
new NoticeInfo(NewMailCond.id, this._mailBox)
);
}
數據變更時通知刷新
// 數據變更
this._mailBox.unreadCount++;
// 方式一:透過 NoticeManager 以條件 ID 通知 (效率最好)
NoticeManager.Notify(NewMailCond.id);
// 方式二:重新 RegisterNotice 註冊條件與數據 (會更新數據並自動刷新)
this.mailNoticeItem.RegisterNotice(new NoticeInfo(NewMailCond.id, this._mailBox));
// 方式三:透過 NoticeManager 以 NoticeItem 通知
NoticeManager.Notify(this.mailNoticeItem);
// 方式四:直接由 NoticeItem 通知自身持有條件
this.mailNoticeItem.Notify();
提醒 效率:方式一 > 方式二 > 方式三 > 方式四;便利:方式二 > 方式三 > 方式四 > 方式一。
重要 若使用數值類型 (Value Type) 數據 (如 int),NoticeInfo.data 儲存的是快照,數據變更後必須先透過 RenewNotice 或重新 RegisterNotice 更新數據,再進行 Notify;參考類型 (Reference Type) 則持有引用,變更後僅需 Notify。
// 數值類型數據:先 RenewNotice 更新數據,再 Notify 刷新顯示 (Method Chaining)
this._coin++;
this.coinNoticeItem.RenewNotice(new NoticeInfo(CoinInWalletCond.id, this._coin)).Notify();
[參考 Example]
Installation
| Install via git URL |
|---|
| Add https://github.com/michael811125/OxGKit.git?path=Assets/OxGKit/NoticeSystem/Scripts to Package Manager |
第三方庫 (需自行安裝)
- 使用 OxGKit.LoggingSystem, Add https://github.com/michael811125/OxGKit.git?path=Assets/OxGKit/LoggingSystem/Scripts to Package Manager
Samples (Package Manager -> Samples)
- AI Agent Skills (參考 AI Agent Skills)
- NoticeItem Prefab
- NoticeSystem Demo
模塊 API
- Runtime
- NoticeManager (using OxGKit.NoticeSystem)
- NoticeItem (using OxGKit.NoticeSystem)
- NoticeCondition (using OxGKit.NoticeSystem)
Demo
NoticeSystem Demo