转载自:http://blog.csdn.net/langresser_king/article/details/22095235

使用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了。

[csharp] view plain copy
  1. static string chineseTxt = null;
  2. public UnityEngine.Font baseFont;
  3. public void FixBrokenWord()
  4. {
  5. if (chineseTxt == null) {
  6. TextAsset txt = Resources.Load("config/chinese") as TextAsset;
  7. chineseTxt = txt.ToString();
  8. }
  9. baseFont.RequestCharactersInTexture(chineseTxt);
  10. Texture texture = baseFont.material.mainTexture;    // Font的内部纹理
  11. Debug.Log(string.Format("texture:{0}   {1}", texture.width, texture.height);   // 纹理大小
  12. }

其中baseFont就是NGUI或者是Daikon Forge的文本渲染控件中使用的UnityEngine.Font,在初始化baseFont的时候调用一下FixBrokenWord函数就可以了(只需要调用一次)。它会读取一个含有常用汉字表的文本(随意从网上的常用字表用copy一下就可以了),然后请求一下这段文本的信息,然后内部纹理就会自动被扩展。

Unity动态字体文字破碎的解决方法(Dynamic Font Broken)相关推荐

  1. div css每行文字显示一半 同时文字字体重叠显示不全解决方法

    CSS DIV布局中出现单行或多行文字的每行文字内容不能显示全,上下行文字有一点点重叠现象,文字字体只显示一半解决方法,在低版本IE特别明显文字字体显示不全,在谷歌浏览器等高版本IE浏览器测试还好些. ...

  2. win10系统中photoshop cs6中界面字体太小的解决方法

    win10系统中photoshop cs6中界面字体太小的解决方法 参考文章: (1)win10系统中photoshop cs6中界面字体太小的解决方法 (2)https://www.cnblogs. ...

  3. win10Oracle繁体乱码,win10系统切换繁简字体出现乱码的解决方法

    win10系统内置微软的输入法,工作中经常会遇到有些软件因为系统繁简不兼容而出现乱码,让人感到很疑惑,有什么办法修复?其实这种问题要解决也简单,下面小编和大家说说win10系统切换繁简字体出现乱码的解 ...

  4. Eclipse Java Oxygen不能创建动态的web项目(解决方法)

    Eclipse Java Oxygen不能创建动态的web项目(解决方法) 一.eclipse安装J2EE插件 一.eclipse安装J2EE插件 Oxygen版本Eclipse没有toamct开发工 ...

  5. Unity 多场景/大场景加载解决方法

    Unity 多场景/大场景加载解决方法 文章目录 Unity 多场景/大场景加载解决方法 前言 一.通过距离判断实现加载场景 1.1.原理: 1.2.范围检测 1.3.方法弊端 二.通过触发检测实现加 ...

  6. Unity动态字体在手机上出现字体丢失问题解决

    Unity动态字体在手机上出现字体丢失问题解决 参考文章: (1)Unity动态字体在手机上出现字体丢失问题解决 (2)https://www.cnblogs.com/bicker/p/3669176 ...

  7. WPF程序在Win7系统下字体显示异常(解决方法记录)

    WPF程序在Win7系统下字体显示异常(解决方法记录) 问题描述 WPF程序在大部分客户电脑上正常运行,字体显示正常.仅在某个客户电脑上显示异常.并且不是所有字体都显示为异常状况.指定了具体字体的(如 ...

  8. Win11字体显示乱码的解决方法

    Win11系统字体显示乱码怎么办?最近有用户询问这个问题,在使用电脑的时候发现电脑字体出现了乱码的情况,很是影响使用体验,应该怎么处理呢?针对这一问题,本篇带来了详细的Win11字体显示乱码的解决方法 ...

  9. IEEE conference latex模板自己电脑编译后变形、字体显示异常的解决方法

    IEEE conference latex模板自己电脑编译后变形.字体显示异常的解决方法 最近在投IEEE下面的一个会议,但是把 IEEE 会议模板下载到自己电脑编译时,和原版格式不对,搞得我心态爆炸 ...

最新文章

  1. mysql数据库多级分类汇总_sql多级分类汇总实现介绍
  2. happy card 完全背包dp
  3. java编写自动化脚本生成apk_Unity3D研究院之Android全自动打包生成apk(六十九)
  4. Codeforces Round #664 (Div. 2)
  5. Win11将沿用Win10升级模式 并会有LTSC版本
  6. ElementUI table组件,表格组件,单击单元格可编辑逻辑
  7. ASP.NET2.0中控件的简单异步回调
  8. visual studio输入法打不了中文_(四)让人纠结的双拼输入法,以及承载它的那些输入法们(下)...
  9. 学习笔记:CentOS7学习之十八:Linux系统启动原理及故障排除
  10. 二叉树常见算法总结(java)
  11. webpack 3 零基础入门教程 #16 - 使用 ProvidePlugin 插件来处理像 jQuery 这样的第三方包...
  12. Android 存储学习之在外部存储中读写文件
  13. POJ 1182 食物链
  14. 谷歌约束控件(ConstraintLayout)扁平化布局入门
  15. 河南省邓州市计算机学校,2019年邓州市职业技术学校招生简章及招生专业
  16. 公司邮箱注册申请流程,好用的邮箱功能开启高效办公
  17. html复习第六天 京东首页布局(导航栏/左侧)
  18. OPC基本知识介绍——什么是OPC
  19. 如何实现同一网络的计算机共享文件,同一个局域网内如何共享文件
  20. 格创东智当选深圳市工业互联网联盟首批理事单位

热门文章

  1. ajax跨域练习-第三方api全国天气查询
  2. 浅谈社交类APP的设计思路
  3. 定位导航算法高级框架设计
  4. Zuul ribbon 重试失效分析
  5. live mail 无法加载的错误
  6. ctrip android view,携程旅行-订酒店机票火车票
  7. sliverlight控件
  8. crm客户管理系统为企业带来的价值
  9. 如何修改Tomcat默认端口号8080的方法
  10. EPUB文档格式在线转换DOCX文档格式