unity 界面红点

思路

当前红点向上递归查询父级红点,由父级红点向下查询子级红点的状态来判定自身状态

配置部分

自定义红点id         此红点id的父级红点id

数据结构:class RedPoint

int/Enum redPointType         List ParentPoint                List ChildPoint               bool isShow

初始化数据

List AllRedPoint ;//存储所有表中数据

void SetDependencies()//设置红点父、子节点,优先父节点
{
    for (int i = 0; i < Count; i++)
    {
        SetParent(AllRedPoint [i]);
    }
    for (int i = 0; i < Count; i++)
    {
        SetChild(AllRedPoint [i]);
    }
}        

void SetParent(RedPoint data)

{

        data.ParentPoint=List;

}

void SetChild(RedPoint data)

{

        for AllRedPoint

                for AllRedPoint[i].ParentPoint

                        if(data.id==item id)//你有依赖我(将我当父级)我就收你当子级

                                data.ChildPoint.Add(item);

}

事件控制

Dictionary<int redPoint,RedPoint> redPointDic;//存放所有红点数据

bool CheckRedPointState(int curRedPointId)=>{return redPointDic[curRedPointId].isShow}//返回当前红点状态

delegate RedPointStateChangeHandle(bool isShow);//委托事件

Dictionary<int redPointId,RedPointStateChangeHandle> dicEvent;//注册监听红点状态变更事件

void ChangeRedPointState(int id , bool isShow)//改变红点状态

{

        RedPoint rp =redPointDic[id];

        if(rp .isShow == isShow ) return;

        rp .isShow = isShow;

        for rp.ChildPoint //应该是用不到的,一般都是从底层往上找

                item.isShow = isShow       

        for rp.ParentPoint                

                bool isHasChildRedPointShow = false;//当前节点的父节点下是否还有正在展示的红点,有的话就不需要隐藏父级红点了

                if(!isShow)//隐藏时才会判定

                {                        

                        for item.ChildPoint

                                if{child.isShow} 

                                isHasChildRedPointShow=true;

                                break;//就不需要再进行循环了,此父级红点需要继续展示,因为他的子级还有展示中的红点

                }

                if(isHasChildRedPointShow) continue;//就不需要再进行循环了,此父级红点需要继续展示,因为他的子级还有展示中的红点

                rp.ParentPoint[i].isShow= isShow;

                ChangeRedPointState(rp.ParentPoint[i].id,isShow)//递归调用父级红点

        dicEvent[id].Invoke(isShow);//调用已经监听的界面方法

}

界面部分,需要将此脚本挂载到默认展示的节点上

外放出红点id在编辑器环境下配置。

redPointGameObject go;//界面挂载红点

OnEnble() => 将 ChangeRedPoint 注册进 dicEvent 中,CheckRedPointState 判定当前红点是否展示

OnDisEnble()=>注销监听

ChangeRedPoint(bool isShow)=>{redPointObj.SetActive(isShow)};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值