using System; using System.Collections.Generic; using UnityEngine; namespace UnityEngine.UI { /// /// Utility class that is used to help with Text update. /// /// /// When Unity rebuilds a font atlas a callback is sent to the font. Using this class you can register your text as needing to be rebuilt if the font atlas is updated. /// public static class FontUpdateTracker { static Dictionary> m_Tracked = new Dictionary>(); /// /// Register a Text element for receiving texture atlas rebuild calls. /// /// The Text object to track public static void TrackText(Text t) { if (t.font == null) return; HashSet exists; m_Tracked.TryGetValue(t.font, out exists); if (exists == null) { // The textureRebuilt event is global for all fonts, so we add our delegate the first time we register *any* Text if (m_Tracked.Count == 0) Font.textureRebuilt += RebuildForFont; exists = new HashSet(); m_Tracked.Add(t.font, exists); } exists.Add(t); } private static void RebuildForFont(Font f) { HashSet texts; m_Tracked.TryGetValue(f, out texts); if (texts == null) return; foreach (var text in texts) text.FontTextureChanged(); } /// /// Deregister a Text element from receiving texture atlas rebuild calls. /// /// The Text object to no longer track public static void UntrackText(Text t) { if (t.font == null) return; HashSet texts; m_Tracked.TryGetValue(t.font, out texts); if (texts == null) return; texts.Remove(t); if (texts.Count == 0) { m_Tracked.Remove(t.font); // There is a global textureRebuilt event for all fonts, so once the last Text reference goes away, remove our delegate if (m_Tracked.Count == 0) Font.textureRebuilt -= RebuildForFont; } } } }