首页
/
行业洞察
/
正文
INDUSTRY INSIGHT · 深度
Unity红点系统笔记
📅 2026/10/11 4:45:36
✍️ 爱科研究院
👁 阅读 3,247
功能描述红点系统就做了两件事出现通知时从叶级UI控件一直到根级出现红点玩家打开到叶级面板点击叶级控件后红点消失连带上面所有级控件的红点更新设计有一个独立于UI系统存在的多叉树分叉结构和UI控件的分叉结构一样。但是UI系统要依赖于节点树。出现通知时红点是从叶向根传的节点需要知道它的父节点在通知数变化时通知父节点。父节点需要知道它的子节点以便统计自己的通知数。节点和红点控件出现的顺序有两种情况通知先出现相关的控件一打开就有红点控件开着此时有了通知出现红点针对通知先有玩家点击按钮打开面板时显示面板时按钮找一下自己的节点有通知就显示红点。需要控件引用节点。针对控件先有显示按钮时先找到或创建自己的节点添加监听。出现通知时分发事件。也是控件引用节点。红点树节点有自己的红点路径路径用比如/分割。节点应该能得到自己的所有子节点以确定自己显不显示红点。还要能得到自己的父节点以便自己的红点变化时通知父节点。有自己红点状态变化时触发的委托。不依赖任何UI不知道UI的存在。有激活红点的方法会找到自己的父级父级也激活红点。有消除红点的方法会找到自己的父级通知父级遍历自己的子级确定自己要不要显示红点。红点树管理器有一个字典键是路径值是树节点。有新建节点的方法输入一个路径把该节点和所有级父节点都建好。有增加红点的方法输入一个路径如果此节点还不存在则建立然后节点激活红点且让父级激活红点每个有父级的节点都这么做。新建一条红点路径优化业务层新建一个红点时都是叶节点从根-枝-叶的节点都要建好。然后常规思路是把路径分割成从开头到第1个/、第2个/……直到完整路径全部建立节点。容易产生大量临时字符串。为了优化我们想到叶子节点拥有最长的路径枝节点可以复用这个最长路径开始、结束索引。红点UI组件有自己监听的节点的路径从检查器填。有对自己监听的节点的引用。有显示隐藏红点的方法。初始化时自己监听的节点如果没有则要建好。点击按钮清除红点的功能可以让按钮脚本去找红点也可以红点UI去找按钮。调试工具可以输入任意路径建立红点。红点信息的保存、序列化现在我想到哪些按钮有红点是否属于玩家数据的一部分是的。正如我们看到红点关闭游戏再打开仍然能看到红点它和玩家数值、道具这些是一并存储的。这时想到存储红点数据是否就是在一份道具的数据类里加一个bool isNew。然后怎么知道它关联的UI以及每一级父UI应该让按钮加载时去找它对应的节点决定自己是否显示红点以及数量。需要在按钮上挂某个组件或者直接继承按钮。看了一套源代码是树管理器用总字典存所有的节点路径。红点Mono通过检查器配置自己的路径开始时红点Mono把自己路径的节点加入管理器的总字典但是不会把路径里自己的父节点加入。会从根节点一级一级加入节点的子节点数组。此时我们大概写一下红点系统的需求有红点的按钮身上挂有红点组件或者写一个继承按钮的组件开始时红点组件新建对应的节点需要有某种方法说明它在树里的位置。可以是字符串绝对路径或者字符串分割太费劲用字符串列表这样管理器的字典的键就是一个字符串列表不用字符串列表标记节点的路径不适合总字典此时用记录根节点的字典。新通知通知到红点组件红点组件依次通知父级。然而有通知时叶子节点一般是不存在或隐藏的通知应该是在节点发生不依赖红点组件的。对于根按钮是节点通知红点组件显示红点对于里面的按钮是按钮显示时读取对应的节点有没有通知来决定显示红点。玩家点击叶节点按钮对应节点的通知状态消失通知红点组件关闭通知通知每一层父级重新计算通知数树需要一个根据路径查/建一体的返回所查节点的函数。总结红点系统是一个存在于内存不依赖UI存在的树通常用字符串作节点的键。红点所在的按钮显示OnEnable时去寻找找不到就创建它对应的节点相互关联。红点组件可能给节点树发消息按叶节点按钮解除通知节点树也可能给红点组件发消息。程序内部出现通知时也是发出一个路径查找或创建目标节点更新通知数量。所以树的查找/创建节点并返回节点的方法很重要。using UnityEngine.Events; using System.Collections.Generic; using UnityEngine; public class MyTreeNode { public Liststringpath new Liststring(); MyTreeNode parent; public Dictionarystring,MyTreeNode children new Dictionarystring, MyTreeNode(); UnityActionint updateNoti; public MyTreeNode(Liststringpath,MyTreeNode parent) { this.path path; this.parent parent; } int notiNum; public int NotiNum { set { if (value 0) { notiNum value; if(parent ! null) { parent.Recalculate(); } updateNoti?.Invoke(value); } } get { return notiNum; } } public void Recalculate() { int temp 0; foreach(KeyValuePairstring,MyTreeNode kvp in children) { temp kvp.Value.NotiNum; } NotiNum temp; } public void AddListener(UnityActionint callback) { updateNoti callback; } public void RemoveListener(UnityActionint callback) { updateNoti - callback; } }using System.Collections; using System.Collections.Generic; using UnityEngine; public class MyTreeManager : MySingletonMyTreeManager { Dictionarystring, MyTreeNode nodeDic new Dictionarystring, MyTreeNode(); public MyTreeNode GetOrBuildNode(Liststring path)//建好从根到此节点的节点 { Dictionarystring, MyTreeNode dic nodeDic; MyTreeNode parentnull; for (int i 0; i path.Count; i) { if (!dic.ContainsKey(path[i])) { dic[path[i]] new MyTreeNode(path.GetRange(0, i), parent); } parent dic[path[i]]; dic dic[path[i]].children; } return parent; } public void PrintRoots() { foreach(KeyValuePairstring,MyTreeNodep in nodeDic) { Debug.Log(p.Key); } } }using UnityEngine.UI; using System.Collections.Generic; using UnityEngine; public class RedDotMono : MonoBehaviour { public Liststringpath new Liststring(); MyTreeNode node; public Image reddot; public Text textNotiNum; void Awake() { reddot.gameObject.SetActive(false); } private void OnEnable() { nodeMyTreeManager.Instance.GetOrBuildNode(path); node.AddListener(ShowDot); ShowDot(node.NotiNum); } private void OnDisable() { node.RemoveListener(ShowDot); } public void ShowDot(int notiNum) { if (notiNum 0) { reddot.gameObject.SetActive(true); textNotiNum.text notiNum.ToString(); } else { reddot.gameObject.SetActive(false); } } public void CloseNoti() { node.NotiNum 0; } }应用和遇到的问题现在我想把红点系统应用于一些动态生成的按钮它们来自同一个预制体。那么红点控件的path也不能在检查器写需要代码生成。比如我新解锁了一关然后关卡按钮和关卡界面那关格子显示红点点击格子查看详情后红点消失。关卡数据是从配表读取在配表写死。那么就应该在关卡配表的关卡条目中加一个path。解锁新关卡时添加树节点path来自关卡配表条目关卡按钮显示时先得到自己的path寻找节点找到就显示红点。再想象我们需要新获得装备时在装备格子显示红点。需要在玩家装备数据的装备条目里加redDotPath一件装备是新获得的就有红点路径。玩家可能没点红点就退出下次打开应该还能看见。装备格子的红点路径好像是不需要精确到格子本身的路径的只要读到路径不为空就显示自己的红点。而路径用于建好前级的节点以便打开背包的按钮能找到自己的节点显示红点。例如获得的装备路径就是pack1格子显示时不是去找节点而是看到这个路径不为空就显示红点。打开游戏时就读取玩家装备数据根据path把节点建好。这要在显示大厅面板之前然后大厅面板显示时能知道哪些按钮显示红点。
📌 标签:
工业官网
设计趋势
AI 建站
SEO
获取完整报告 →
RELATED ARTICLES
推荐阅读
2026/10/11 4:40:36
EG2181 半桥驱动芯片原理与应用解析
2026/10/11 4:40:36
团队统一包装皮肤怎么做?2026智能包装工作流,5款工具实测解析
2026/10/11 4:40:36
不会还有人把 Rule、Skill、MCP 写成一锅粥吧?边界一糊,落地全糊 | AI 工程化概念地图
2026/10/11 5:30:39
趣博思AI任务书:导师为什么总说你的任务书“不够具体”?因为你写的是计划,不是承诺
2026/10/11 5:30:39
趣博思AI任务书:为什么你的毕业论文任务书,导师只看了三十秒就退了回来?
2026/10/11 5:30:39
本地AI Agent从零部署实战:模型、记忆、工具、编排与远程接入
2026/10/11 5:30:39
趣博思 AI|理性看待 AIGC 检测,建立合规的 AI 辅助论文写作习惯
2026/10/11 5:30:39
趣博思 AI|分清查重与 AIGC 检测,提前识别论文里隐藏的 AI 文本特征
2026/10/11 5:25:39
通用神经网络处理器核内调度优化:关键路径与启发式算法实战
2026/10/11 0:00:10
流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南
2026/10/11 0:00:10
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别
2026/10/11 0:00:10
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容
2026/10/11 0:00:10
流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南
2026/10/11 0:00:10
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别
2026/10/11 0:00:10
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容
2026/10/10 3:41:56
我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
2026/10/10 3:41:54
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026/10/9 11:36:17
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)