跳到主要内容

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 时会自动调用此方法注销全部持有条件,一般无需手动处理 (对象池回收除外)。