找回密码
 立即注册
查看: 258|回复: 0

Unity前缀树红点系统设计

[复制链接]
发表于 2023-1-12 18:56 | 显示全部楼层 |阅读模式
本文借助前缀树结构设计,借助事件触发机制,可有效应付复杂的红点系统设计,满足性能需求。
先看下红点前缀树结构图


如图:当有事件更新红点时,会一级级向上更新父节点。
代码层借助命名key中"/",作为分隔符,创建层级节点
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RedDotManager
{
    private static RedDotManager _instance;
    public static RedDotManager Instance
    {
        get
        {
            if(_instance == null)
                _instance = new RedDotManager();
            return _instance;
        }
    }

    private RedDotNode rootNode = new RedDotNode(null);
    private Dictionary<string, RedDotNode> _allNodes = new Dictionary<string, RedDotNode>();

    //以"/"作为分隔符
    public void AddListen(string key, Action<int> callBack)
    {
        var splitKeys = key.Split("/");
        RedDotNode curNode = rootNode;
        foreach (var splitKey in splitKeys)
        {
            curNode = curNode.GetOrAddChild(splitKey);
        }

        curNode.AddListen(callBack);
        _allNodes.Add(key, curNode);
    }

    public void RemoveListen(string key)
    {
        if (_allNodes.TryGetValue(key, out RedDotNode node))
        {
            node.Destroy();
            _allNodes.Remove(key);
        }
    }

    public RedDotNode GetNode(string key)
    {
        return _allNodes[key];
    }
}Node节点
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RedDotNode
{
    private Dictionary<string, RedDotNode> _nodes = new Dictionary<string, RedDotNode>();
    private RedDotNode _parentNode;
    private int _count;
    private Action<int> _changeCallback;
    public RedDotNode(RedDotNode parent)
    {
        _parentNode = parent;
    }

    public void AddListen(Action<int> callback)
    {
        _changeCallback += callback;
    }

    public void RemoteListen(Action<int> callback)
    {
        _changeCallback -= callback;
    }

    public RedDotNode GetOrAddChild(string key)
    {
        if (_nodes.TryGetValue(key, out RedDotNode node))
        {
            return node;
        }
        var newNode = new RedDotNode(this);
        _nodes.Add(key, newNode);
        return newNode;
    }

    public void ValueIncre(int incre)
    {
        _count += incre;
        _changeCallback?.Invoke(_count);
        _parentNode?.ValueIncre(incre);
    }

    public int GetCount()
    {
        return _count;
    }

    public void Destroy()
    {
        _changeCallback = null;
    }
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2025-1-24 06:21 , Processed in 0.094634 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表