小红点系统
模块预览图:
图1
图2
图1为子层,图2为主层,当子层拥有信息时,往主层通知。
思路:子层绑定主层。当消息状态来了,通知主层,主层亮起红点。这就意味着,我们要把这个系统写成树形结构。
首先我们要有个根节点,根节点下有许多子节点,子节点下又会拥有许多子节点。这点必须要清楚。
理清上面关系后,开始整理代码
首先:
我们需要创建和绑定根节点
当我传入的第一个节点是空的,那么默认设置它为根节点,否则就会往它下面增加子节点
再然后就是一个创建普通节点的重载方法
这里我们会通过它的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 来控制状态
大致就是这样,不是很难,当初我竟然想去写二叉树,脑袋秀了