树状结构 每一个红点脚本 拥有多少父节点 和当前孩子显示的数量底层数据发生变化上层跟着变换。支持主动查询和被动通知。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public delegate void OnRedPointChange(bool disPlay);
public class TrackPoint
{
public bool DisPlay { get; private set; }
private OnRedPointChange _OnChange = null;
public event OnRedPointChange OnChange
{
add
{
_OnChange += value;
value(DisPlay);
}
remove { _OnChange -= value; }
}
public int SubDisplayCount { get; private set; }
private List<TrackPoint> ParentTrackPoints = new List<TrackPoint>();
public TrackPoint()
{
DisPlay = false;
}
public static implicit operator bool (TrackPoint trackPoint)
{
return trackPoint != null && trackPoint.DisPlay;
}
public void SetParent(TrackPoint parent)
{
if (parent == null)
{
Debug.LogError("注册父节点不能为空");
return;
}
if (ParentTrackPoints.Contains(parent))
{
Debug.LogError("当前红点已经注册过这个父节点了");
return;
}
ParentTrackPoints.Add(parent);
if (DisPlay)
{
parent.OnSubDisplayCountChange(true);
}
}
public void Change(bool disPlay)
{
if (DisPlay != disPlay)
{
DisPlay = disPlay;
foreach (var trackPoint in ParentTrackPoints)
{
trackPoint.OnSubDisplayCountChange(DisPlay);
}
_OnChange?.Invoke(DisPlay);
}
}
public void OnSubDisplayCountChange(bool disPlay)
{
if (disPlay)
{
SubDisplayCount++;
}
else
{
SubDisplayCount--;
}
Change(SubDisplayCount > 0);
}
public void Reset()
{
SubDisplayCount = 0;
Change(false);
ParentTrackPoints = new List<TrackPoint>();
_OnChange = null;
}
public void ClearSub()
{
SubDisplayCount = 0;
Change(false);
}
}