跳到主要内容

NoticeCondition

重要 注意 提醒

Coding Style wiki​


NoticeCondition 为 NoticeSystem 的通知条件基类 (抽象类),自定义条件需继承并实现 ShowCondition 判断是否显示红点,经由 NoticeManager.RegisterCondition 注册后自动分配条件 ID;可通过 Right-Click Create/OxGKit/Notice System/Template Notice Condition.cs 创建条件模板 (参考 模块介绍)。

命名空间OxGKit.NoticeSystem
类型public abstract class NoticeCondition
源码NoticeCondition.cs
using OxGKit.NoticeSystem;

快速上手​

using OxGKit.NoticeSystem;
using UnityEngine;

public class NewMailCond : NoticeCondition
{
#region Default
// 惯例:定义静态属性获取自动分配的条件 ID
public static int id { get { return NoticeManager.GetConditionId<NewMailCond>(); } }

// 于场景加载前自动注册条件 (对应 BeforeSceneLoad 模板)
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
static void Register()
{
NoticeManager.RegisterCondition<NewMailCond>();
}
#endregion

public override bool ShowCondition(object data)
{
if (data != null)
{
MailBox mailBox = data as MailBox;

// 有未读邮件则显示红点
if (mailBox.unreadCount > 0) return true;
}

return false;
}
}

通用规则​

  • 条件类为纯逻辑类,ShowCondition 内不要持有 MonoBehaviour 状态或场景引用。
  • ShowCondition 的 data 可能为 null 或不同类型 (多个 UI 共用同一条件时),需做防御性检查。
  • 条件 ID 由 NoticeManager.RegisterCondition 注册时自动分配,惯例上于条件类中定义静态属性 id。

提醒 单一 NoticeItem 持有多个条件为 OR 逻辑 (任一符合即显示);若需 AND 逻辑,将整组判断写在同一个条件类的 ShowCondition 中。


方法总览​

方法说明
SetId设置条件 ID (由 NoticeManager 注册时自动调用)。
GetId获取条件 ID。
ShowCondition(抽象) 依数据判断条件是否成立 (是否显示红点)。

SetId​

public void SetId(int id)

设置条件 ID。

注意 由 NoticeManager.RegisterCondition 于注册时自动调用,一般无需自行调用。

GetId​

public int GetId()

获取条件 ID (亦可通过 NoticeManager.GetConditionId<T>() 以类型查询)。

ShowCondition​

public abstract bool ShowCondition(object data)

依传入的数据判断条件是否成立,返回 true 表示显示红点;data 为 NoticeItem 注册时通过 NoticeInfo 传入的数据。


NoticeInfo​

通知信息 (结构),包含条件 ID 与判断数据,作为 NoticeItem.RegisterNotice / RenewNotice 的注册单位。

类型public struct NoticeInfo
源码NoticeInfo.cs

成员​

成员说明
public int conditionId条件 ID。
public object data交给 ShowCondition 判断的数据 (可为值类型或引用类型)。

构造函数​

public NoticeInfo(int conditionId, object data)
// 引用类型数据 (变更后仅需 Notify)
new NoticeInfo(NewMailCond.id, this._mailBox);

// 值类型数据 (变更后必须 RenewNotice 更新快照,再 Notify)
new NoticeInfo(CoinInWalletCond.id, this._coin);

重要 值类型 (Value Type) 数据存储的是快照,数据变更后必须通过 NoticeItem.RenewNotice 更新数据再 Notify,否则红点不会刷新。