红点树 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默认是组件所在物体:挂在「整行根节点」上会把整行隐藏掉。