◆ 持续开发中 · 当前为非稳定版本,如需抢先体验请通过 GitHub Issues 联系作者

红点树 RedDot

在代码里注册一棵红点树,玩法侧只打标(Mark / SetCount),UI 侧在 AbsUISystem 里挂一下 RedDotBehaviour 就能自动显隐——父节点亮灭由子节点自动聚合,不需要手动逐级刷新。

命名空间 HYC.Framework.RedDot。已实现。

注册树

using HYC.Framework.RedDot;

public static class RedDotIds
{
    public static readonly RedDotKey Main     = new RedDotKey(1000);
    public static readonly RedDotKey Mail     = new RedDotKey(1001);
    public static readonly RedDotKey MailSys  = new RedDotKey(1002);
    public static readonly RedDotKey Shop     = new RedDotKey(1100);
}

// 在引导阶段(Bootstrap / 首个 System 初始化)注册一次即可
RedDotManager.Register(RedDotIds.Main,    default,              "主界面");
RedDotManager.Register(RedDotIds.Mail,    RedDotIds.Main,       "邮件", mode: RedDotMode.Count);
RedDotManager.Register(RedDotIds.MailSys, RedDotIds.Mail,       "系统邮件");
RedDotManager.Register(RedDotIds.Shop,    RedDotIds.Main,       "商店");

RedDotKey 是强类型键(包一个 int),代码侧没有字符串,拼错编译不过。

打标与计数

RedDotManager.Mark(RedDotIds.MailSys);        // 置「亮」
RedDotManager.Mark(RedDotIds.Shop, false);    // 熄
RedDotManager.SetCount(RedDotIds.MailSys, 3); // 计数(> 0 同时视为亮)

持久化(框架不写文件,宿主自己导)

// 存盘
var states = new List<RedDotState>();
RedDotManager.ExportState(states);          // 只导「自有值」,聚合值可重算
saveData.redDots = states;

// 读档(注册完树之后)
RedDotManager.ImportState(saveData.redDots);

RedDotState 是 [Serializable] 的 { int Id; int Count; bool Flag; },可直接进存档结构。

UI 侧

预制体上挂 RedDotBehaviour(Key / Show Count / Count Label / Badge),由 AbsUISystem 自动收集绑定。切场景 / 重登重建红点注册前先 RedDotManager.Clear() 再重新 Register。

只读查看器:HYC Framework/Tools/Red Dot Viewer(列出节点层级、自有值、聚合值、子节点数;非 Play 模式下通常为空)。

坑

  • 不要用 EventMessage 承载红点态——它是单帧消息,红点要跨帧。
  • 父节点没注册时,子节点的「亮」不会冒泡;注册顺序建议自顶向下。
  • override OnViewOpen/OnViewClose 必须调 base——红点绑定与退订挂在基类上。(OnViewOpen 漏调有兜底:首次 OnUpdate 会补绑一次;OnViewClose 漏调会漏退订。)
  • 红点只在主线程读写(无锁),不要在 Job 里调。
  • Badge 默认是组件所在物体:挂在「整行根节点」上会把整行隐藏掉。