You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 14:25:26