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

Unity 2020中如何通过代码为UnityEngine.UI.Text加载并设置磁盘字体?

问题

我正在为一款现有Unity游戏制作本地化Mod,受限于游戏的CRC校验机制,无法使用编辑器操作,所有修改必须通过纯代码完成,且不能修改任何资源包或预制体。所需字体资源必须在运行时从磁盘加载。

目前已成功实现TextMeshPro文本对象的本地化适配,修复了原本显示空白矩形的问题,代码如下:

UnityEngine.Font NewFont = new Font("D:/some_folder/test_font.ttf");
TMP_FontAsset NewFontAsset = TMP_FontAsset.CreateFontAsset(NewFont);
TMP_Settings.fallbackFontAssets.Add(NewFontAsset);

但同样的思路对UnityEngine.UI.Text无效:设置字体后文本完全消失,连空白矩形都不显示,代码如下:

UnityEngine.UI.Text SomeGameText = ...;
UnityEngine.Font NewFont = new Font("D:/some_folder/test_font.ttf");
SomeGameText.font = NewFont;

我尝试过复用原文本的材质,也调用了SomeGameText.font.RequestCharactersInTexture(characters),但都没有效果。想请教:

  • Unity引擎对UnityEngine.UI.Text的字体处理逻辑是怎样的?
  • 我是否遗漏了关键步骤?
  • 针对这种场景,正确的字体设置流程是什么?

Unity版本:2020.3.26f1

解决方案

Unity UI.Text的字体处理逻辑

UnityEngine.UI.Text的渲染依赖三个核心要素:

  1. Font资源:存储字体的字形数据
  2. 字符纹理图集:Unity会将需要显示的字符渲染到一张纹理上,供UI.Text采样
  3. 材质:使用UI/Default(或自定义)Shader,绑定字符纹理图集,负责最终的渲染输出

直接通过new Font(path)创建字体,仅加载了字形数据,但未自动完成字符纹理生成和材质绑定的流程,这是文本消失的核心原因。

正确的实现步骤

1. 正确加载字体资源

避免直接使用new Font(path),改用字节流加载的方式,确保Unity完整初始化字体的所有内部资源:

using System.IO;
// 读取磁盘字体文件为字节数组
byte[] fontBytes = File.ReadAllBytes("D:/some_folder/test_font.ttf");
// 通过字节数组创建Font实例,确保初始化完整
UnityEngine.Font newFont = Font.CreateFont(fontBytes);

2. 处理材质与字符纹理

UI.Text的材质必须绑定字体生成的字符纹理,可通过两种方式处理:

  • 方式一:复用原文本材质(推荐)
    保留原文本的Shader和材质设置,仅替换纹理:
    // 获取原文本的材质
    Material targetMaterial = SomeGameText.fontMaterial;
    // 将字体生成的字符纹理赋值给材质主纹理
    targetMaterial.mainTexture = newFont.texture;
    
  • 方式二:创建新材质
    如果原材质有特殊设置无法复用,可创建标准UI材质:
    Material targetMaterial = new Material(Shader.Find("UI/Default"));
    targetMaterial.mainTexture = newFont.texture;
    // 可选:复制原材质的颜色、透明度等设置
    targetMaterial.color = SomeGameText.fontMaterial.color;
    

3. 生成所需字符的纹理

调用RequestCharactersInTexture,指定需要显示的文本、字号和样式,确保Unity将这些字符渲染到纹理图集:

// 替换为你需要显示的本地化文本内容
string localizeText = "你的本地化文本";
// 请求生成对应字号、样式的字符纹理
newFont.RequestCharactersInTexture(
    localizeText, 
    SomeGameText.fontSize, 
    SomeGameText.fontStyle
);

4. 绑定资源并刷新文本

将处理好的字体和材质绑定到UI.Text,并强制刷新:

SomeGameText.font = newFont;
SomeGameText.fontMaterial = targetMaterial;
// 强制刷新文本布局和渲染状态
SomeGameText.SetAllDirty();

关键注意事项

  • 必须确保RequestCharactersInTexture的参数(字号、样式)与UI.Text的实际设置完全一致,否则生成的字符纹理无法匹配
  • 部分游戏可能使用自定义UI Shader,此时需要确保材质使用的Shader与原文本一致,仅替换纹理
  • 若字体包含特殊字符(如中文、日文),需确保RequestCharactersInTexture传入完整的目标文本,避免遗漏字符导致显示异常

内容的提问来源于stack exchange,提问作者wd357dui

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 12:27:49