小红点模块

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值