今天我同事说在老项目用的是unity4.7.2打包发布韩文和泰文,偶尔会出现字体花屏的问题,但是中文是好的。(我也不知道怎么解释,只能靠猜吧)我们用的TTF动态字体,Text每次赋值的时候Unity会生成贴图,以及保存每个字的UV信息,那么显示字体的时候根据UV信息去生成的贴图里取最终渲染在屏幕上。那么出现花屏很可能就是贴图更新了,而还在用老的UV取图,所以就取不到了。这个时候需要重新刷新一下Text理论上就正确。
下面的代码挂在任意对象上。意思就是Font.textureRebuilt监听字体的贴图是否发生rebuild的事件。然后调用text.FontTextureChanged();重新刷新一下字体
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37  | 
						using UnityEngine; using System.Collections; using UnityEngine.UI; public class UIFontDirty : MonoBehaviour {     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();                 }             }             print("雨松MOMO textureRebuilt " + dirtyFont.name);             dirtyFont = null;         }     } }  | 
					
我也不确定在别的unity版本,或者别的文字里还会出现这个问题。欢迎大家测试,也欢迎大家在下面给我留言。
- 本文固定链接: https://www.xuanyusong.com/archives/4259
 - 转载请注明: 雨松MOMO 于 雨松MOMO程序研究院 发表
 
                        	捐  赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!
                        
                        					
Unity2018.4 出现了在Text上使用材质球实现图文混排,Text使用材质球后就出现文字花屏问题,目前还没有找到解决方案,雨神大佬不知道有没有碰到过
好贴好贴
   momo 大神,我想写一个类来拓展UGui 里面的自带的类,比如Button,该如何实现啊…  也可以从顶栏上的GameObject菜单 里面去创建或是右键去创建,就想创建普通的uGUI的Button 一样,没有unity的源码 只是看了一下Button的函数简介,只知道上面有一个 AddComponentMenu(“UI/Button”, 30)]  这个貌似是Component菜单的,求指教
momo大神,我碰到几个问题想向你请教下,,不知道怎么留言,只能找你最近发的贴子留言了。希望能帮我解惑下1、用u3d自带的CharacterController控制角色,有个坡已经很陡了,虽然角色走不上去,但是跳跃在落下的时候可以稳稳的站在坡上,如何才能让他跳跃 也跳不上去呢?难道只能把坡变为90度的陡坡吗?2、加载的时候当加载多个assetBundle的时候怎么处理, www只能一次加载一个,执行多次的协程www,这样子加载进度好像不是非常好控制3、镜像动画是不是只能说在u3d里面复制一个原始动画出来。 勾上镜像,可否直接用代码实现镜像呢。这个也没有找到相关API,求mono指点
雨神 你这种方式不是和NGUI里UILabel的处理方式一样的吗 但是他还是会出现字体花屏的static void OnFontTextureChanged (){ Debug.LogError(“OnFontTextureChanged”);for (int i = 0; i < mList.size; i){UILabel lbl = mList
 ;if (lbl != null){Font fnt = lbl.trueTypeFont;if (fnt != null){                    //请求字符加入到纹理中;fnt.RequestCharactersInTexture(lbl.mText, lbl.mPrintedSize, lbl.mFontStyle);}}}for (int i = 0; i < mList.size;   i){UILabel lbl = mList 
 ;if (lbl != null){Font fnt = lbl.trueTypeFont;if (fnt != null){#if UNITY_EDITOR                    lbl.panel.RebuildAllDrawCalls();#else                    //将Label Widget从Panel中删除;lbl.RemoveFromPanel();                    //确保这个Widget在Panel中;lbl.CreatePanel();#endif}}}}#endif
雨神 你这种方式不是和NGUI里UILabel的处理方式一样的吗 但是他还是会出现字体花屏的static void OnFontTextureChanged () { Debug.LogError(“OnFontTextureChanged”); for (int i = 0; i < mList.size; ++i) { UILabel lbl = mList
 ;			if (lbl != null)			{				Font fnt = lbl.trueTypeFont;				if (fnt != null)				{                    //请求字符加入到纹理中;					fnt.RequestCharactersInTexture(lbl.mText, lbl.mPrintedSize, lbl.mFontStyle);				}			}		}		for (int i = 0; i < mList.size; ++i)		{			UILabel lbl = mList 
 ;			if (lbl != null)			{				Font fnt = lbl.trueTypeFont;				if (fnt != null)				{#if UNITY_EDITOR                    lbl.panel.RebuildAllDrawCalls();#else                    //将Label Widget从Panel中删除;					lbl.RemoveFromPanel();                    //确保这个Widget在Panel中;					lbl.CreatePanel();#endif				}			}		}	}#endif
FontTextureChanged 是UGUI提供的。 NGUI我们很早就放弃了。 现在只要保证UGUI正确OK.
好吧,那你们以前用NGUI是的做法是不是一开始扩充字符纹理啊
NGUI是大前年在用。 当时游戏比较小没出过这个问题。。我也不确定UGUI这样是不是真的不会花屏幕。一开始扩充纹理我个人觉得不是特别好。 如果做多语言的话每个国家都得搞一套。。。。
我在Unity5.1.2版本也遇到过,UI界面切换的时候中文字体会花屏,试了很多办法,后来在一个帖子上看到一个解决办法,在初始化的时候构建一个足够大的字体贴图,我是这么解决的 if (chineseTxt == null) { TextAsset txt = Resources.Load(“use”) as TextAsset;//读取只写了一个字的use.txt chineseTxt = txt.ToString(); } baseFont.RequestCharactersInTexture(chineseTxt,512); Texture texture = baseFont.material.mainTexture;回去也试试 雨松大大的方法
这方法我知道, 初始化游戏的时候把text的贴图撑大。