思路:
当前红点向上递归查询父级红点,由父级红点向下查询子级红点的状态来判定自身状态
配置部分
自定义红点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)};