| using System.Collections; | 
| using System.Collections.Generic; | 
| using UnityEngine; | 
| using System; | 
|   | 
|   | 
| 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 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; | 
|         } | 
|     } | 
|   | 
| } |