using System; using System.Collections.Generic; using UnityEngine; namespace FairyGUI { /// /// /// public class FontManager { public static Dictionary sFontFactory = new Dictionary(); /// /// /// /// /// static public void RegisterFont(BaseFont font, string alias = null) { sFontFactory[font.name] = font; if (alias != null) sFontFactory[alias] = font; } /// /// /// /// static public void UnregisterFont(BaseFont font) { List toDelete = new List(); foreach (KeyValuePair kv in sFontFactory) { if (kv.Value == font) toDelete.Add(kv.Key); } foreach (string key in toDelete) sFontFactory.Remove(key); } /// /// /// /// /// static public BaseFont GetFont(string name) { BaseFont font; if (name.StartsWith(UIPackage.URL_PREFIX)) { font = UIPackage.GetItemAssetByURL(name) as BaseFont; if (font != null) return font; } if (sFontFactory.TryGetValue(name, out font)) return font; object asset = Resources.Load(name); if (asset == null) asset = Resources.Load("Fonts/" + name); //Try to use new API in Uinty5 to load if (asset == null) { if (name.IndexOf(",") != -1) { string[] arr = name.Split(','); int cnt = arr.Length; for (int i = 0; i < cnt; i++) arr[i] = arr[i].Trim(); asset = Font.CreateDynamicFontFromOSFont(arr, 16); } else asset = Font.CreateDynamicFontFromOSFont(name, 16); } if (asset == null) return Fallback(name); if (asset is Font) { font = new DynamicFont(); font.name = name; sFontFactory.Add(name, font); ((DynamicFont)font).nativeFont = (Font)asset; } #if FAIRYGUI_TMPRO else if (asset is TMPro.TMP_FontAsset) { font = new TMPFont(); font.name = name; sFontFactory.Add(name, font); ((TMPFont)font).fontAsset = (TMPro.TMP_FontAsset)asset; } #endif else { if (asset.GetType().Name.Contains("TMP_FontAsset")) Debug.LogWarning("To enable TextMeshPro support, add script define symbol: FAIRYGUI_TMPRO"); return Fallback(name); } return font; } static BaseFont Fallback(string name) { if (name != UIConfig.defaultFont) { BaseFont ff; if (sFontFactory.TryGetValue(UIConfig.defaultFont, out ff)) { sFontFactory[name] = ff; return ff; } } Font asset = (Font)Resources.GetBuiltinResource(typeof(Font), "Arial.ttf"); if (asset == null) throw new Exception("Failed to load font '" + name + "'"); BaseFont font = new DynamicFont(); font.name = name; ((DynamicFont)font).nativeFont = asset; sFontFactory.Add(name, font); return font; } /// /// /// static public void Clear() { foreach (KeyValuePair kv in sFontFactory) kv.Value.Dispose(); sFontFactory.Clear(); } } }