using System.Collections.Generic; using UnityEngine.UI.Collections; namespace UnityEngine.UI { // 游戏中只有一份单例 public class GraphicRegistry { private static GraphicRegistry s_Instance; // 按Canvas分类统计Graphic private readonly Dictionary> m_Graphics = new Dictionary>(); protected GraphicRegistry() { // This is needed for AOT on IOS. Without it the compile doesn't get the definition of the Dictionarys #pragma warning disable 168 Dictionary emptyGraphicDic; Dictionary emptyElementDic; #pragma warning restore 168 } public static GraphicRegistry instance { get { if (s_Instance == null) s_Instance = new GraphicRegistry(); return s_Instance; } } public static void RegisterGraphicForCanvas(Canvas c, Graphic graphic) { if (c == null) return; IndexedSet graphics; instance.m_Graphics.TryGetValue(c, out graphics); if (graphics != null) { graphics.AddUnique(graphic); return; } // Dont need to AddUnique as we know its the only item in the list graphics = new IndexedSet(); graphics.Add(graphic); instance.m_Graphics.Add(c, graphics); } public static void UnregisterGraphicForCanvas(Canvas c, Graphic graphic) { if (c == null) return; IndexedSet graphics; if (instance.m_Graphics.TryGetValue(c, out graphics)) { graphics.Remove(graphic); if (graphics.Count == 0) instance.m_Graphics.Remove(c); } } private static readonly List s_EmptyList = new List(); public static IList GetGraphicsForCanvas(Canvas canvas) { IndexedSet graphics; if (instance.m_Graphics.TryGetValue(canvas, out graphics)) return graphics; return s_EmptyList; } } }