using System.Collections.Generic; using TMPro; using UnityEngine; using UnityEngine.TextCore.LowLevel; namespace SceneView { public static class FontUtilities { private static readonly Dictionary _fontCache = new Dictionary(); /// /// 根据字体名称从操作系统加载字体,并创建 TMP_FontAsset(带缓存) /// 非常遗憾,用不了 /// /// 系统字体名称,如 "Arial", "Microsoft YaHei" 等 /// 对应的 TMP_FontAsset,失败则返回 null public static TMP_FontAsset? GetOrCreateTMPFont(string fontName) { if (string.IsNullOrWhiteSpace(fontName)) return null; if (_fontCache.TryGetValue(fontName, out var cached)) return cached; var baseFont = Font.CreateDynamicFontFromOSFont(fontName, 12); // 12 是临时大小,不影响 TMP 字体质量 if (baseFont == null || baseFont.dynamic == false) { Debug.LogWarning($"Font '{fontName}' not found in OS."); return null; } // 创建 TMP 字体资源 var tmpFont = TMP_FontAsset.CreateFontAsset( baseFont, 72, 4, GlyphRenderMode.SDFAA, 1024, 1024, AtlasPopulationMode.Dynamic, true ); if (tmpFont != null) { _fontCache[fontName] = tmpFont; Debug.Log($"Loaded TMP font: {fontName}"); } else { Debug.LogError($"Failed to create TMP_FontAsset from font: {fontName}"); } return tmpFont; } /// /// 清空缓存(谨慎使用,通常不需要) /// public static void ClearCache() { _fontCache.Clear(); } } }