尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Unity红点系统笔记
功能描述红点系统就做了两件事出现通知时从叶级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把节点建好。这要在显示大厅面板之前然后大厅面板显示时能知道哪些按钮显示红点。
RELATED

相关推荐

团队统一包装皮肤怎么做?2026智能包装工作流,5款工具实测解析

团队统一包装皮肤怎么做?2026智能包装工作流,5款工具实测解析

短视频矩阵团队在批量出片时常遇到风格不统一的痛点:不同剪辑师做出的知识点卡片样式各异,账号视觉识别度被稀释。团队统一包装皮肤怎么做?核心思路是通过支持本地渲染的智能包装(smart video packaging)模块&#xff…

📅 2026/10/11 4:40:39
不会还有人把 Rule、Skill、MCP 写成一锅粥吧?边界一糊,落地全糊 | AI 工程化概念地图

不会还有人把 Rule、Skill、MCP 写成一锅粥吧?边界一糊,落地全糊 | AI 工程化概念地图

上一篇:不会还有人只会聊天写 Prompt 吧?同事都在落地,你还 out | AI 工程化开篇 不会还有人把 Rule、Skill、MCP 写成一锅粥吧?边界一糊,落地全糊 | AI 工程化概念地图系列:《从 Rule 到落地:A…

📅 2026/10/11 4:40:39
如何在十分钟内部署免费的打字练习工具 qwerty-learner

如何在十分钟内部署免费的打字练习工具 qwerty-learner

如何在十分钟内部署免费的打字练习工具 qwerty-learner 【免费下载链接】qwerty-learner 为键盘工作者设计的单词记忆与英语肌肉记忆锻炼软件 / Words learning and English muscle memory training software designed for keyboard workers 项目地址: https://gitcode.com/G…

📅 2026/10/11 4:40:39
MORE NEWS

更多资讯

📰

AnyPS5跨平台串流工具:架构解析与实操指南

1. 从“AnyPS5”这个标题说起:一个跨平台串流工具的设计初衷第一次看到“AnyPS5”这个标题,我脑子里蹦出来的第一个念头是:这大概率又是一个折腾远程串流的项目。果不其然,翻了一圈社区讨论和零散的代码片段之后,基本可…

📰

如何不被自媒体干扰,真正地独立思考

不论是刷小红书还是刷 X,我们总是能看到各种热点新闻:“小龙虾风靡全球”“ChatGPT 发布史上最强模型”“某某模型打败了所有竞争对手”……现在的信息传播非常快,一个新产品刚刚发布,可能还没来得及仔细了解它,互联网…

📰

GitHub 热榜连续一周霸榜的 AI 智能体工具层:技能包、MCP 服务与上下文压缩三条路线

GitHub 热榜连续一周霸榜的 AI 智能体工具层:技能包、MCP 服务与上下文压缩三条路线 开篇:一周日榜说明了什么,又没有说明什么 2026 年 10 月 2 日至 10 月 8 日这一周,GitHub 日榜上最密集的一类项目不是新的模型、新的框架&…

📰

鄂州红莲湖固化,地坪抗渗耐磨-福阔地坪

福阔地坪环氧自流平:给爱家增添色彩的艺术涂料选择 在快节奏生活的今天,我们每一个人内心深处都有一片渴望安静下来的天地,在那里可以尽情享受家的温暖与美好。而随着人们对生活品质追求不断提升,“个性化”“舒适度”和“安全环保…

📰

财务智能体选型:先找高频重复,还是先找高价值场景?

选错第一个场景,可能让整个项目死在起跑线上。财务智能体立项时,团队通常会分成两派。 一派主张从高频重复的场景切入:发票识别、报销审核、银企对账,这些工作每天发生、规则明确、人工耗时巨大,上线后效果立竿见影。另…

📰

Spring Boot+Vue+AI预测:电竞赛事中心全栈项目实战

做这个项目,最初是因为看比赛的时候总喜欢猜谁赢,弹幕上也是一堆人问“这波谁能赢”“打野差距太大了”。后来想着,与其口头争论,不如干脆把“AI预测赛事结果”这件事做成一个正经的系统。于是就有了这套电竞赛事中心:…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬