以UGUI系统为例,字体分为内置字体、外部导入字体、自定义字体。
文字一般通过Text组件进行显示。目前Unity已经官方支持TextMeshPro,因此也有一些文字通过TextMeshPro-Text(UI)组件进行展示,可以支持比Text组件更强大的功能(更强大的富文本、图文混排)。同时我们也可以借用工具(比如bmfont)设计效果更复杂的所谓美术字,Text组件是默认支持美术字显示的。

内置字体

当创建Text组件后,默认的字体是Arial,这是个西文字体,是Unity自带的字体。之所以在编辑器和手机上发现也可显示中文是Unity底层对其进行了处理,在运行时遇到Arial字库中没有的字,会从系统的默认字库中查找到对应的文字。因此若遇到刚好系统字库也没有某个字符,就会导致字体不显示或者乱码的问题。
DroidSansFallback字体是Android设备初期时默认的中文字体,由谷歌委托台湾华康科技设计的,是可以免费商用的字体。这个字体的观感和微软的雅黑类似,看起来非常的舒适,支持东亚的各国的文字(繁体中文、简体中文、韩文、日文)。但是由于Android系统的可定制,太过自由,不排除有些厂商会修改默认字体,因此在安卓机器中若默认字体不是DroidSansFallback,即使机器中有该字体,Unity程序在遇到Arial字库中没有的字符时,也无法查找到,造成显示上的问题。
基于上述原因,不建议使用默认字体Arial,除非你的游戏是纯英文的,不考虑本地化和特殊字符。

PS:笔者测试DroidSansFallback字体样式和Arial很详尽,肉眼几乎不可区分

动态字体

上述提到不建议使用内置Arial字体,因此玩家可以根据需要把.ttf字体拖到Untiy内,比如,我把C:\Windows\Fonts目录下幼圆 常规拖到Unity内为:

对应的Inspector界面为:

Font Size值默认为16,数值越大设置文字对应的texture越大。
Character默认使用Dynamic选项,若使用Custom set选项,则字体中只有用户在Custom Chars内设置的字符才会显示。
Include Font Data默认是勾选的,在打包的时候会把字体添加到包中,若不勾选,则不会把该字体打包。
Font Names是字体名,有些api需要通过字体名获得字体,就要传入这里显示的名字,当然这个名字是可以修改的。注意这个名字要和XXX.ttf中的XXX区分。

动态字体丢失、破碎问题

1,我们用到的ttf字体,在Text每次赋值的时候Unity会生成贴图,以及相应UV信息。显示字体的时候再根据UV信息去贴图里面去取对应区域的图片信息并渲染到屏幕上。出现花屏的原因一般是贴图更新了,但是UV信息没有更新,这个时候需要用心的UV去取。

bool isDirty = false;Font dirtyFont = null;void Awake(){Font.textureRebuilt += delegate(Font font1){isDirty = true;dirtyFont = font1;};}void LateUpdate(){if (isDirty){isDirty = false;foreach (Text text in GameObject.FindObjectsOfType<Text>()){if (text.font == dirtyFont){text.FontTextureChanged();}}dirtyFont = null;}}

2,上面截图中可以看到ttf字体在Unity中会生成一个texture和一个material文件。当需要显示文字的时候,会通过RequestCharactersInTexture函数向Font请求更新文字信息,然后使用GetCharacterInfo获取文字信息来渲染。在调用GetCharacterInfo的时候要保证文字都通过RequestCharactersInTexture请求过了。如果请求的时候,Font内部维护的texture不够用了,就会触发textureRebuildCallback的回调,通知外部Font的对象,其内部的texture被更新了,外部应该重新刷新。
Unity的Font默认的texture大小是256X256,在纯英文的情况下,是完全够用的。但是汉字,日文等字体就完全不够了。如果unity的刷新回调触发,则要重新刷新所有的文本控件。这样就容易出现字体破碎的情况。因为一般情况下我们请求的文字不会很多,使用的texture不会超过256x256,unity不会自动扩展texture大小。但我们请求的文字过多时,texture如果不够了,这时就需要在回调函数中刷新字体,如果我们连续请求文字,每次texture都需要扩展(需要回调刷新),于是就会出现不停刷新,字体也可能会破碎。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class FontTextureSize : MonoBehaviour {// Use this for initializationvoid Start () {Font stx = Resources.Load<Font>("字体名");//注意这里就需要传入字体名,见上文Texture tex = stx.material.mainTexture;Debug.Log(string.Format("texture:{0} {1}", tex.width, tex.height));TextAsset ta = Resources.Load<TextAsset>("word");//word.txt内存储了很多文字string word = ta.text;stx.RequestCharactersInTexture(word);tex = stx.material.mainTexture;Debug.Log(string.Format("texture:{0} {1}", tex.width, tex.height));}// Update is called once per framevoid Update () {}
}

自定义字体

自定义字体一般使用bmfont来制作,不再赘述

浅谈Unity中的文字显示相关推荐

  1. 浅谈unity中gamma空间和线性空间

    转载请标明出处:http://www.cnblogs.com/zblade/ 一.概述 很久没有写文章了,今天写一篇对gamma空间和线性空间的个人理解总结,在查阅和学习了各个资料后,算是一个个人笔记 ...

  2. 浅谈Unity中的rotation和Quaternion的乘法

    动手写游戏以后一个比较切身的体会,就是实际操作能检验很多语言的细节,也许平时看API文档,或者看一些教程的时候并没有深刻的体会,因为大多情况下你只知道了该怎么做,却不知道为什么要这么做,或者怎么想到这 ...

  3. audio unity 加速_浅谈Unity中Android、iOS音频延迟

    在Unity上面做音游,当在移动端实机运行起来,会发现,音频的发出会有一定的延迟,无论是长音效还是短音效,Unity内置的Audio内部使用的是FMOD,有以下手段改善 通过设置稍微改善其延迟的问题 ...

  4. php css定位到图片上,CSS_浅谈css中图片定位之所有图标放在一张图上,如今做网页为了使网站丰富多 - phpStudy...

    浅谈css中图片定位之所有图标放在一张图上 如今做网页为了使网站丰富多彩,富于表现力,往往需要应用大量的图片/图标.如何处理这些图片,使其尽量不影响网页载入,解析等速度,是一个不大不小的问题.如果你的 ...

  5. 浅谈Unity与VR产业,用Unity开发VR应用

    VR(Virtual Reality的缩写,中文翻译-虚拟现实)概念早在80年代初就被提出来的,其具体是指借助计算机及最新传感器技术创造的一种崭新的人机交互手段. 中国VR产业仍在摸索阶段,亟缺复合型 ...

  6. 浅谈Unity与VR产业,用Unity开发第一款VR应用

    部分内容为整合与装载 浅谈VR VR(Virtual Reality的缩写,中文翻译-虚拟现实)概念早在80年代初就被提出来的,其具体是指借助计算机及最新传感器技术创造的一种崭新的人机交互手段. 中国 ...

  7. mybatis与php,浅谈mybatis中的#和$的区别

    浅谈mybatis中的#和$的区别 发布于 2016-07-30 11:14:47 | 236 次阅读 | 评论: 0 | 来源: 网友投递 MyBatis 基于Java的持久层框架MyBatis 本 ...

  8. 浅谈Java中的Set、List、Map的区别

    就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...

  9. 浅谈Linux中ldconfig和ldd的用法

    ldd 查看程序依赖库 ldd 作用:用来查看程式运行所需的共享库,常用来解决程式因缺少某个库文件而不能运行的一些问题. 示例:查看test程序运行所依赖的库: /opt/app/todeav1/te ...

最新文章

  1. “重构”黑洞:26岁MIT研究生的新算法 | 人物志
  2. Spring Boot 2.x整合Quartz
  3. 用于HTTP加密浏览的TW2.0插件
  4. 关于android创建快捷方式会启动两个应用的问题(一)
  5. 训练深度神经网络的时候需要注意的一些小技巧
  6. Python练习 | 初识Python、数据类型、基本语句
  7. 同步 GIT@OSC 实现MARKDOWN文件发布或更新到CSDN博客中
  8. beijing olympics - a travesty
  9. linux 挂载raid_linux初学者-磁盘阵列篇
  10. Hyper-V用差异磁盘克隆系统
  11. php h5视频录制上传,基于koa的h5视频录制异步上传
  12. 微信小程序豆瓣电影项目的改造过程经验分享
  13. MongoDB的性能优化
  14. 解决Office2010每次打开都要配置进度的问题
  15. 关于补天SRC新手入门详细介绍(通用漏洞篇)
  16. A Hierarchical Latent Variable Encoder-Decoder Model for Generating Dialogues论文笔记
  17. 浅谈网络劫持的原理及影响
  18. Chrome浏览器下载与设置
  19. 程序员欣宸的文章分类汇总
  20. DAMA数据治理学习笔记-数据管理成熟度评估

热门文章

  1. android patch app,AndroidN,O 加载到patch 以后重启app crash了.
  2. debussy和modelsim联合仿真配置
  3. 三星手机动态修改分辨率信息
  4. 电饭锅鸿蒙系统,有了美的轻食电饭煲,人们更加确定了做饭工具的重要性
  5. 「TYVJ1017」冗余关系
  6. android list嵌套list,Android开发日常-listVIiew嵌套webView回显阅读位置
  7. 鹏哥手把手带我刷好题 · 编程练习 · I
  8. SQLI DUMB SERIES-2
  9. AliOS Things 编译体系
  10. OKR是上下同欲的载体