能否从Unity外部本地文件夹加载并使用自定义字体?
从外部路径加载字体到Unity并生成TMP字体资源
你的原代码核心错误是把字体文件当作图片来加载——LoadImage是处理PNG/JPG这类图片的API,完全不适用于.ttf/.otf这类字体文件。下面是修正后的实现方案:
修正后的代码
using System.IO; using UnityEngine; using TMPro; public class ExternalFontLoader : MonoBehaviour { public void LoadExternalFont(string fontPath) { // 先检查文件是否存在 if (!File.Exists(fontPath)) { Debug.LogError($"找不到字体文件: {fontPath}"); return; } // 读取字体文件字节数组 byte[] fontData = File.ReadAllBytes(fontPath); // 从字节数组创建Font实例(这才是加载字体的正确方式) Font font = Font.CreateFontFromMemory(fontData, 0, fontData.Length, 0); if (font == null) { Debug.LogError("无法从字节数组初始化字体"); return; } // 设置字体名称,方便识别 font.name = Path.GetFileNameWithoutExtension(fontPath); // 创建TextMeshPro专用材质(用默认的距离场Shader) Material tmpMaterial = new Material(Shader.Find("TextMeshPro/Distance Field")); font.material = tmpMaterial; // 生成TMP字体资源 TMP_FontAsset tmpFontAsset = TMP_FontAsset.CreateFontAsset(font); if (tmpFontAsset == null) { Debug.LogError("生成TMP字体资源失败"); return; } tmpFontAsset.name = $"TMP_{font.name}"; // 【Editor模式可选】把生成的字体资源保存到项目目录 #if UNITY_EDITOR UnityEditor.AssetDatabase.CreateAsset(tmpFontAsset, $"Assets/ExternalFonts/{tmpFontAsset.name}.asset"); UnityEditor.AssetDatabase.SaveAssets(); #endif // 示例:给当前物体的TextMeshProUGUI组件设置新字体 TextMeshProUGUI targetText = GetComponent<TextMeshProUGUI>(); if (targetText != null) { targetText.font = tmpFontAsset; } } }
关键注意点
- 支持格式:Unity兼容的.ttf、.otf、.woff等字体格式都可以用这个方法加载
- 权限问题:读取Windows系统字体文件夹(C:\Windows\Fonts)时,打包后的应用需要确保有读取权限,部分系统可能需要用户授权
- 内存清理:如果频繁加载不同字体,记得在不需要时调用
Destroy()销毁Font和TMP_FontAsset实例,避免内存泄漏 - 打包后处理:Build后的应用无法使用
AssetDatabase,如果需要持久化字体,要么每次启动时动态加载,要么用ScriptableObject等方式保存字体数据
内容的提问来源于stack exchange,提问作者Pedro _F.M
相关产品推荐
相关产品推荐

