UI层的信息推送,小红点系统

本文介绍了一种基于树形结构的小红点通知系统实现方案。该系统通过节点类维护父子节点关系,当子节点状态变化时能及时通知到父节点更新UI显示,适用于各类应用内的消息提示场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

小红点系统

模块预览图:

图1
图1
图2
图2

图1为子层,图2为主层,当子层拥有信息时,往主层通知。
思路:子层绑定主层。当消息状态来了,通知主层,主层亮起红点。这就意味着,我们要把这个系统写成树形结构。

首先我们要有个根节点,根节点下有许多子节点,子节点下又会拥有许多子节点。这点必须要清楚。
理清上面关系后,开始整理代码

首先:

我们需要创建和绑定根节点
图1

当我传入的第一个节点是空的,那么默认设置它为根节点,否则就会往它下面增加子节点

再然后就是一个创建普通节点的重载方法
t

这里我们会通过它的Key去找到对应的父节点,找到后,往父节点下创建子节点。

然后我们的每个节点都会有个小红点,所以我们需要把对应的节点绑定对应的UI。包括节点的获取
这里写图片描述

public class BaseNode
    {

        public string key;

        public BaseNode parent;

        public BaseNode rootNode;

        public bool nodeValue;

        public bool localValue;

        public GameObject ui;


        public List<BaseNode> childNode_list = new List<BaseNode>();


        public BaseNode() { }
        public BaseNode(string urlKey, bool value)
        {
            this.key = urlKey;
            this.nodeValue = value;
        }

        /// <summary>
        /// 根据Key找到父节点
        /// </summary>
        /// <param name="nKey"></param>
        public void AddChild(BaseNode node)
        {
            if (!this.childNode_list.Contains(node))
            {
                this.childNode_list.Add(node);
                node.parent = this;
            }
            this.Update();
        }

        protected void Update()
        {
            this.nodeValue = this.localValue;
            if (!this.localValue)
            {
                for (int i = 0; i < this.childNode_list.Count; i++)
                {
                    this.nodeValue |= this.childNode_list[i].nodeValue;
                }
            }
            UpdateUI();
            if (this.parent != null)
            {
                this.parent.Update();
            }
        }

        public void SetValue(bool vals)
        {
            this.localValue = vals;
            Update();
        }

        private void UpdateUI()
        {
            if (ui != null)
            {
                ui.SetActive(this.nodeValue);
            }
        }

        public void BindUI(GameObject ui)
        {
            this.ui = ui;
            UpdateUI();
        }

    }

上面的代码是节点类,这节点类里面包含它所有的子节点,同理,如果是子节点,那么它也会包含它所有的子节点。

AddChild : 添加节点,当我们需要动态添加节点,可添加进入后调用Update的更新节点
this.localValue : 表示当前节点的状态,true是亮起,false是熄灭。都会调用Update去更新
BindUI:绑定节点对应的小红点,通过 SetValue 来控制状态

大致就是这样,不是很难,当初我竟然想去写二叉树,脑袋秀了

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值