hch
2025-06-19 5022f4efe76121df33dc81249befa7556e535418
Main/System/Redpoint/RedpointCenter.cs
@@ -3,128 +3,128 @@
using UnityEngine;
using System;
    public class RedpointCenter : Singleton<RedpointCenter>
public class RedpointCenter : Singleton<RedpointCenter>
{
    public event Action<int> redpointValueChangeEvent;
    Dictionary<int, Redpoint> redpoints = new Dictionary<int, Redpoint>();
    Dictionary<int, List<int>> parentChildren = new Dictionary<int, List<int>>();
    public RedpointCenter()
    {
        public event Action<int> redpointValueChangeEvent;
        Dictionary<int, Redpoint> redpoints = new Dictionary<int, Redpoint>();
        Dictionary<int, List<int>> parentChildren = new Dictionary<int, List<int>>();
        public RedpointCenter()
        {
        }
        public void ResetAllRedpointState()
        {
            foreach (var redpoint in redpoints.Values)
            {
                redpoint.state = RedPointState.None;
            }
        }
        public void Register(Redpoint _redpoint)
        {
            var id = _redpoint.id;
            if (redpoints.ContainsKey(id))
            {
                Debug.LogErrorFormat("重复注册红点:id->{0}", id);
            }
            redpoints[id] = _redpoint;
            var parentId = _redpoint.parent;
            if (parentId > 0)
            {
                List<int> children = null;
                if (!parentChildren.TryGetValue(parentId, out children))
                {
                    parentChildren[parentId] = children = new List<int>();
                }
                if (!children.Contains(id))
                {
                    children.Add(id);
                }
            }
        }
        public void Report(Redpoint _redpoint)
        {
            var parentId = _redpoint.parent;
            if (redpointValueChangeEvent != null)
            {
                redpointValueChangeEvent(_redpoint.id);
            }
            if (parentId > 0)
            {
                TestParentValue(_redpoint.parent);
            }
        }
        public void ReportWithoutParent(Redpoint _redpoint)
        {
            if (redpointValueChangeEvent != null)
            {
                redpointValueChangeEvent(_redpoint.id);
            }
        }
        public RedPointState GetRedpointState(int _id)
        {
            Redpoint redpoint = null;
            if (this.redpoints.TryGetValue(_id, out redpoint))
            {
                return redpoint.state;
            }
            else
            {
                return RedPointState.None;
            }
        }
        public int GetRedpointCount(int _id)
        {
            Redpoint redpoint = null;
            if (this.redpoints.TryGetValue(_id, out redpoint))
            {
                return redpoint.count;
            }
            else
            {
                return 0;
            }
        }
        void TestParentValue(int _parentId)
        {
            List<int> children = null;
            Redpoint parent = null;
            if (redpoints.TryGetValue(_parentId, out parent) && parentChildren.TryGetValue(_parentId, out children))
            {
                var parentState = RedPointState.None;
                for (int i = 0; i < children.Count; i++)
                {
                    Redpoint child = null;
                    if (redpoints.TryGetValue(children[i], out child))
                    {
                        if (child.state > parentState)
                        {
                            parentState = child.state;
                        }
                    }
                    if (parentState == RedPointState.Full)
                    {
                        break;
                    }
                }
                parent.state = parentState;
            }
        }
    }
    public void ResetAllRedpointState()
    {
        foreach (var redpoint in redpoints.Values)
        {
            redpoint.state = RedPointState.None;
        }
    }
    public void Register(Redpoint _redpoint)
    {
        var id = _redpoint.id;
        if (redpoints.ContainsKey(id))
        {
            Debug.LogErrorFormat("重复注册红点:id->{0}", id);
        }
        redpoints[id] = _redpoint;
        var parentId = _redpoint.parent;
        if (parentId > 0)
        {
            List<int> children = null;
            if (!parentChildren.TryGetValue(parentId, out children))
            {
                parentChildren[parentId] = children = new List<int>();
            }
            if (!children.Contains(id))
            {
                children.Add(id);
            }
        }
    }
    public void Report(Redpoint _redpoint)
    {
        var parentId = _redpoint.parent;
        if (redpointValueChangeEvent != null)
        {
            redpointValueChangeEvent(_redpoint.id);
        }
        if (parentId > 0)
        {
            TestParentValue(_redpoint.parent);
        }
    }
    public void ReportWithoutParent(Redpoint _redpoint)
    {
        if (redpointValueChangeEvent != null)
        {
            redpointValueChangeEvent(_redpoint.id);
        }
    }
    public RedPointState GetRedpointState(int _id)
    {
        Redpoint redpoint = null;
        if (this.redpoints.TryGetValue(_id, out redpoint))
        {
            return redpoint.state;
        }
        else
        {
            return RedPointState.None;
        }
    }
    public int GetRedpointCount(int _id)
    {
        Redpoint redpoint = null;
        if (this.redpoints.TryGetValue(_id, out redpoint))
        {
            return redpoint.count;
        }
        else
        {
            return 0;
        }
    }
    void TestParentValue(int _parentId)
    {
        List<int> children = null;
        Redpoint parent = null;
        if (redpoints.TryGetValue(_parentId, out parent) && parentChildren.TryGetValue(_parentId, out children))
        {
            var parentState = RedPointState.None;
            for (int i = 0; i < children.Count; i++)
            {
                Redpoint child = null;
                if (redpoints.TryGetValue(children[i], out child))
                {
                    if (child.state > parentState)
                    {
                        parentState = child.state;
                    }
                }
                if (parentState == RedPointState.Full)
                {
                    break;
                }
            }
            parent.state = parentState;
        }
    }
}