跳至主要内容

模塊介紹

重要 注意 提醒

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

第三方庫 (需自行安裝)

Samples (Package Manager -> Samples)

  • AI Agent Skills (參考 AI Agent Skills)
  • NoticeItem Prefab
  • NoticeSystem Demo

模塊 API


Demo

NoticeSystem Demo