Files
DuckovMods/SceneView/FontUtilities.cs

67 lines
2.1 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.TextCore.LowLevel;
namespace SceneView
{
public static class FontUtilities
{
private static readonly Dictionary<string, TMP_FontAsset> _fontCache = new Dictionary<string, TMP_FontAsset>();
/// <summary>
/// 根据字体名称从操作系统加载字体,并创建 TMP_FontAsset带缓存
/// 非常遗憾,用不了
/// </summary>
/// <param name="fontName">系统字体名称,如 "Arial", "Microsoft YaHei" 等</param>
/// <returns>对应的 TMP_FontAsset失败则返回 null</returns>
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;
}
/// <summary>
/// 清空缓存(谨慎使用,通常不需要)
/// </summary>
public static void ClearCache()
{
_fontCache.Clear();
}
}
}