跳至主要内容

NoticeItem

重要 注意 提醒

Coding Style wiki


NoticeItem 是掛載於紅點圖示 (ICON) 上的通知物件組件 (MonoBehaviour),持有條件 ID 與數據 (NoticeInfo) 的註冊,當持有的任一條件符合時自動顯示自身 GameObject;可透過 Package Manager -> Samples 匯入 NoticeItem Prefab 拖曳至 UI 上直接使用,亦可透過 Add Component -> OxGKit -> NoticeSystem -> NoticeItem 自行掛載。

命名空間OxGKit.NoticeSystem
類型[DisallowMultipleComponent] public class NoticeItem : MonoBehaviour
原始碼NoticeItem.cs
using OxGKit.NoticeSystem;

快速上手

using OxGKit.NoticeSystem;
using UnityEngine;

public class MailUI : MonoBehaviour
{
// 將 NoticeItem prefab 拖曳至 UI 上,再指定引用
public NoticeItem mailNoticeItem;

private MailBox _mailBox = new MailBox();

private void Awake()
{
// 註冊條件與數據 (註冊時會自動檢查條件並刷新顯示)
this.mailNoticeItem.RegisterNotice
(
new NoticeInfo(NewMailCond.id, this._mailBox)
);
}

public void ReceiveMail()
{
// 數據變更後,通知刷新紅點顯示
this._mailBox.unreadCount++;
this.mailNoticeItem.Notify();
}
}

通用規則

顯示規則

  • 單一 NoticeItem 可持有多個條件,持有的任一條件符合 (ShowCondition 回傳 true) 則顯示自身 GameObject,皆不符合則隱藏 (OR 邏輯)。

重要 NoticeItem 切換的是自身 GameObject 的顯示,因此紅點應為按鈕底下的子物件圖示節點,不要直接掛在按鈕本身,否則按鈕會跟著被隱藏。

提醒 若需 AND 邏輯,將整組判斷寫在同一個條件類ShowCondition 中即可。

自動註銷

注意 當 NoticeItem OnDestroy 時,會自動 DeregisterNotice 註銷自身全部持有條件。

提醒 物件池 (Pooled UI) 回收時不會觸發 OnDestroy,需自行呼叫 DeregisterNotice 避免殘留註冊。

數值類型數據

重要 NoticeInfo.data數值類型 (Value Type) 數據 (如 int) 儲存的是快照,數據變更後必須透過 RenewNotice 更新數據再 Notify;參考類型 (Reference Type) 則持有引用,變更後僅需 Notify。


方法總覽

方法說明
HasCondition檢查是否持有指定條件 ID。
Notify通知自身持有的所有條件進行刷新顯示。
RenewNotice更新條件數據 (Method Chaining),未持有時自動註冊。
RegisterNotice註冊條件與數據,並自動檢查條件刷新顯示。
DeregisterNotice註銷指定條件 (不帶參數 = 註銷全部)。

HasCondition

public bool HasCondition(int conditionId)

檢查自身是否持有指定條件 ID 的註冊。

if (this.mailNoticeItem.HasCondition(NewMailCond.id))
{
// ...
}

Notify

public void Notify()

通知自身持有的所有條件 ID 進行 NoticeManager.Notify 刷新顯示。

// 數據變更後 (參考類型),直接通知刷新
this._mailBox.unreadCount++;
this.mailNoticeItem.Notify();

RenewNotice

public NoticeItem RenewNotice(NoticeInfo noticeInfo)

更新指定條件的數據 (回傳自身,可 Method Chaining);若條件尚未持有,會自動轉為 RegisterNotice 進行註冊。

// 數值類型數據為快照,變更後必須 RenewNotice 更新數據,再 Notify 刷新顯示
this._coin++;
this.coinNoticeItem.RenewNotice(new NoticeInfo(CoinInWalletCond.id, this._coin)).Notify();

RegisterNotice

public void RegisterNotice(params NoticeInfo[] noticeInfos)

註冊條件與數據 (NoticeInfo),註冊後自動檢查條件並刷新顯示重複註冊同一條件時會改為更新數據 (Renew) 並再次通知

// 單一 NoticeItem 可持有多個條件 (任一條件符合即顯示紅點)
this.walletNoticeItem.RegisterNotice
(
// 數值類型數據
new NoticeInfo(CoinInWalletCond.id, this._coin),
// 參考類型數據
new NoticeInfo(CoinIsEvenCond.id, this._wallet)
);

注意 註冊前條件必須已透過 NoticeManager.RegisterCondition 完成註冊,否則條件 ID 無法解析 (回傳 0)。

DeregisterNotice

public void DeregisterNotice(params int[] conditionIds)

註銷指定條件 ID 的註冊;不帶參數時註銷自身全部持有條件,註銷後會重新檢查條件刷新顯示。

// 註銷指定條件
this.walletNoticeItem.DeregisterNotice(CoinInWalletCond.id);

// 不帶參數 => 註銷自身全部持有條件
this.walletNoticeItem.DeregisterNotice();

提醒 OnDestroy 時會自動呼叫此方法註銷全部持有條件,一般無需手動處理 (物件池回收除外)。