小红点模块

树状结构 每一个红点脚本 拥有多少父节点 和当前孩子显示的数量底层数据发生变化上层跟着变换。支持主动查询和被动通知。

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);
    }
    
}

猜你喜欢

转载自blog.csdn.net/qq_39691716/article/details/121576759
今日推荐