跳到主要内容

NoticeCondition

重要 注意 提醒

Coding Style wiki


NoticeConditionNoticeSystem通知条件基类 (抽象类),自定义条件需继承并实现 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 状态或场景引用。
  • ShowConditiondata 可能为 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,否则红点不会刷新。