树状结构 每一个红点脚本 拥有多少父节点 和当前孩子显示的数量底层数据发生变化上层跟着变换。支持主动查询和被动通知。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public delegate void OnRedPointChange(bool disPlay);
public class TrackPoint
{
/// <summary>
/// 当前红点是否显示
/// </summary>
public bool DisPlay {
get; private set; }
/// <summary>
/// 当前红点状态发生改变的回调
/// </summary>
private OnRedPointChange _OnChange = null;
/// <summary>
/// 红点回调事件
/// </summary>
public event OnRedPointChange OnChange
{
add
{
_OnChange += value;
value(DisPlay);
}
remove {
_OnChange -= value; }
}
/// <summary>
/// 当前红点拥有的孩子数量
/// </summary>
public int SubDisplayCount {
get; private set; }
/// <summary>
/// 当前红点的父节点集合
/// </summary>
private List<TrackPoint> ParentTrackPoints = new List<TrackPoint>();
/// <summary>
/// 构造函数
/// </summary>
public TrackPoint()
{
DisPlay = false;
}
/// <summary>
/// 通过implicit隐身转换 可以主动查询当前红点状态 将TrackPoint类当作Bool值来用 提高代码可读性
/// </summary>
/// <param name="trackPoint"></param>
public static implicit operator bool (TrackPoint trackPoint)
{
return trackPoint != null && trackPoint.DisPlay;
}
/// <summary>
/// 注册父节点 可以多个
/// </summary>
/// <param name="parent"></param>
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);
}
}
/// <summary>
/// 改变当前红点状态
/// </summary>
/// <param name="disPlay"></param>
public void Change(bool disPlay)
{
if (DisPlay != disPlay)
{
DisPlay = disPlay;
//通知父节点 孩子减少1
foreach (var trackPoint in ParentTrackPoints)
{
trackPoint.OnSubDisplayCountChange(DisPlay);
}
_OnChange?.Invoke(DisPlay);
}
}
/// <summary>
/// 改变孩子SubCount数量
/// </summary>
/// <param name="disPlay"></param>
public void OnSubDisplayCountChange(bool disPlay)
{
if (disPlay)
{
SubDisplayCount++;
}
else
{
SubDisplayCount--;
}
Change(SubDisplayCount > 0);
}
/// <summary>
/// 重置当前红点
/// </summary>
public void Reset()
{
SubDisplayCount = 0;
Change(false);
ParentTrackPoints = new List<TrackPoint>();
_OnChange = null;
}
/// <summary>
/// 清理孩子状态
/// </summary>
public void ClearSub()
{
SubDisplayCount = 0;
Change(false);
}
}