Unity运行时如何将TTF文件导入为自定义字体?
加载自定义字体的可行方案(Unity环境)
原生Font类动态加载方案
如果使用Unity原生Text组件,可通过读取字体文件字节流直接创建Font实例,支持TTF/OTF格式:
using System.IO; using UnityEngine; using UnityEngine.UI; public class CustomFontLoader : MonoBehaviour { public Text targetText; public void LoadCustomFontFromLocal(string fontPath) { if (!File.Exists(fontPath)) return; byte[] fontBytes = File.ReadAllBytes(fontPath); Font customFont = new Font(fontBytes); targetText.font = customFont; targetText.text = "测试自定义字体"; } }
TMPro动态加载自定义字体方案
针对TextMeshPro组件,需通过TMP_FontAsset.CreateFontAsset方法生成可直接使用的字体资源:
using System.IO; using UnityEngine; using TMPro; public class TMPCustomFontLoader : MonoBehaviour { public TextMeshProUGUI targetTMPText; public void LoadCustomTMPFont(string fontPath) { if (!File.Exists(fontPath)) return; byte[] fontBytes = File.ReadAllBytes(fontPath); TMP_FontAsset tmpFontAsset = TMP_FontAsset.CreateFontAsset(fontBytes); tmpFontAsset.material.shader = Shader.Find("TextMeshPro/Distance Field"); targetTMPText.font = tmpFontAsset; targetTMPText.text = "TMPro自定义字体测试"; } }
平台兼容性注意事项
- 移动端:无法直接通过
File.ReadAllBytes读取StreamingAssets目录,需用UnityWebRequest加载:using UnityEngine.Networking; using UnityEngine; using TMPro; public IEnumerator LoadFontOnMobile(string fontName) { string fontUrl = Path.Combine(Application.streamingAssetsPath, fontName); using (UnityWebRequest request = UnityWebRequest.Get(fontUrl)) { yield return request.SendWebRequest(); if (request.result == UnityWebRequest.Result.Success) { byte[] fontBytes = request.downloadHandler.data; TMP_FontAsset tmpFont = TMP_FontAsset.CreateFontAsset(fontBytes); targetTMPText.font = tmpFont; } } } - 权限问题:确保字体文件有读取权限,PC端可通过文件选择器让用户指定路径,移动端需申请外部存储读取权限。
内容的提问来源于stack exchange,提问作者Tiziano Kraft
相关产品推荐
相关产品推荐

