Unity动态字体文字破碎的解决方法(Dynamic Font Broken)
2017-02-04 10:33
344 查看
使用Unity的动态字体绘制文字的时候,打开两个ui界面的时候,后面的文字会显示破碎(完全乱掉)。我使用的ui插件是Daikon Forge,由于其label的更新机制问题,最终表现的结果可能比一个文本显示破碎更加糟糕。很可能文本控件会不停的刷新,要打开的新界面也显示不出来。
这个从根本上说,是由于Unity的Dynamic Font实现的不够智能。理论上NGUI也会有这样的问题。只要你使用的是动态字体,并且渲染的文字构多。
NGUI和Daikon Forge内部在绘制文字的时候使用了Unity 的Font,这个就是动态字体。通过RequestCharactersInTexture函数向Font请求更新文字信息,然后使用GetCharacterInfo获取文字信息来渲染。在调用GetCharacterInfo的时候要保证所有文字都通过RequestCharactersInTexture请求过了。
如果请求的时候,Font内部维护的texture不够用了,就会触发textureRebuildCallback的回调,通知外部使用Font的对象,其内部的texture被更新了,外部应该重新刷新。
Unity的Font默认的texture大小是256x256,在纯英文字体的情况下,是完全够用了。但是汉字、日文等东方字体就完全不够了。而之前说的那两个插件的使用方式都是绘制文字的时候请求一段,如果unity的刷新回调触发,则重新刷新所有的文本控件。这样就非常容易出现字体破碎的情况。因为一般情况下我们一次请求的文字不会很多,使用的texture不会超过256x256,unity不会自动扩展texture大小。而我们在回调函数中重新刷新字体的时候,又很容易出现texture不够的情况,这样就触发了另一次刷新回调。于是就会发文本控件显示破碎而且不停刷新的情况。
知道了问题的起因,解决方法也就出来了。只要我们请求的文字足够多,那么unity就会内部自动扩展texture大小,于是就可以避免不停刷新的情况。我准备了2000个汉字的文本,在请求文字信息后,内部texture被扩展成1024x1024大小,这样游戏过程中就基本够用了。如果哪天发现这样也不够的话,再多准备一些汉字,把texture扩展成2048x1024就ok了。
static string chineseTxt = null;
public UnityEngine.Font baseFont;
public void FixBrokenWord()
{
if (chineseTxt == null) {
TextAsset txt = Resources.Load("config/chinese") as TextAsset;
chineseTxt = txt.ToString();
}
baseFont.RequestCharactersInTexture(chineseTxt);
Texture texture = baseFont.material.mainTexture; // Font的内部纹理
Debug.Log(string.Format("texture:{0} {1}", texture.width, texture.height); // 纹理大小
}
其中baseFont就是NGUI或者是Daikon Forge的文本渲染控件中使用的UnityEngine.Font,在初始化baseFont的时候调用一下FixBrokenWord函数就可以了(只需要调用一次)。它会读取一个含有常用汉字表的文本(随意从网上的常用字表用copy一下就可以了),然后请求一下这段文本的信息,然后内部纹理就会自动被扩展。
这个从根本上说,是由于Unity的Dynamic Font实现的不够智能。理论上NGUI也会有这样的问题。只要你使用的是动态字体,并且渲染的文字构多。
NGUI和Daikon Forge内部在绘制文字的时候使用了Unity 的Font,这个就是动态字体。通过RequestCharactersInTexture函数向Font请求更新文字信息,然后使用GetCharacterInfo获取文字信息来渲染。在调用GetCharacterInfo的时候要保证所有文字都通过RequestCharactersInTexture请求过了。
如果请求的时候,Font内部维护的texture不够用了,就会触发textureRebuildCallback的回调,通知外部使用Font的对象,其内部的texture被更新了,外部应该重新刷新。
Unity的Font默认的texture大小是256x256,在纯英文字体的情况下,是完全够用了。但是汉字、日文等东方字体就完全不够了。而之前说的那两个插件的使用方式都是绘制文字的时候请求一段,如果unity的刷新回调触发,则重新刷新所有的文本控件。这样就非常容易出现字体破碎的情况。因为一般情况下我们一次请求的文字不会很多,使用的texture不会超过256x256,unity不会自动扩展texture大小。而我们在回调函数中重新刷新字体的时候,又很容易出现texture不够的情况,这样就触发了另一次刷新回调。于是就会发文本控件显示破碎而且不停刷新的情况。
知道了问题的起因,解决方法也就出来了。只要我们请求的文字足够多,那么unity就会内部自动扩展texture大小,于是就可以避免不停刷新的情况。我准备了2000个汉字的文本,在请求文字信息后,内部texture被扩展成1024x1024大小,这样游戏过程中就基本够用了。如果哪天发现这样也不够的话,再多准备一些汉字,把texture扩展成2048x1024就ok了。
static string chineseTxt = null;
public UnityEngine.Font baseFont;
public void FixBrokenWord()
{
if (chineseTxt == null) {
TextAsset txt = Resources.Load("config/chinese") as TextAsset;
chineseTxt = txt.ToString();
}
baseFont.RequestCharactersInTexture(chineseTxt);
Texture texture = baseFont.material.mainTexture; // Font的内部纹理
Debug.Log(string.Format("texture:{0} {1}", texture.width, texture.height); // 纹理大小
}
其中baseFont就是NGUI或者是Daikon Forge的文本渲染控件中使用的UnityEngine.Font,在初始化baseFont的时候调用一下FixBrokenWord函数就可以了(只需要调用一次)。它会读取一个含有常用汉字表的文本(随意从网上的常用字表用copy一下就可以了),然后请求一下这段文本的信息,然后内部纹理就会自动被扩展。
相关文章推荐
- Unity动态字体文字破碎的解决方法(Dynamic Font Broken)
- Unity动态字体文字破碎的解决方法(Dynamic Font Broken)
- 解决Unity Font字体破碎问题
- PS CS4 改变文字字体时弹出“ 无法完成请求 因为程序错误”信息的解决方法
- Unity动态字体在手机上出现字体丢失问题解决
- Unity动态改变src的解决方法
- Flash使用遮罩后动态文字不显示的解决方法
- 解决网页中使用自己喜欢字体容量过大加载过久的问题!字蛛webfont 安装及使用方法
- div css每行文字显示一半 同时文字字体重叠显示不全解决方法
- IE下textarea中font-size值很大时文字不显示的解决方法
- MenuItemFont字体设置bug的解决方法
- [Unity3D] Dynamic Font for NGUI 2.5.0c,动态字体脚本支持NGUI最新版本
- Unity中使用UGUI制作Prefab后,调用Instantiate动态生成Button无法点击的解决方法
- Unity动态字体模糊的原因和解决办法
- win10系统文字很模糊怎么办?win10浏览网页字体不清晰的原因及解决方法
- unityUGUI关于Text字体不清晰的解决方法
- VISIO 2003档案打印至Adobe PDF时,有文字位置/大小/字体 发生变化 的修正方法
- 无限动态参数在ASP分页时自动记录所有参数名的解决方法
- 关于C#中PictureBox加载动态GIF所出现的BUG以及解决方法
- 用图片代替文字时解决方法_主要应用于SEO或者在不支持CSS的浏览器下使用