AutoCAD 3DMAX C言语 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab运用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 主页 > Unity3D

Unity动态字体文字破碎的解决办法(Dynamic Font Broken)

51自学网 2014-05-24 http://www.pvc01.com

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

1
2
3
4
5
6
7
8
9
10
11
12
13
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一下就能够了),然后恳求一下这段文本的信息,然后内部纹路就会 主动被扩展。

NGUI】移动设备上运用动态字体Label显现不正确

办法1:

晋级Unity到4.3版别以上

办法2:

首要,需求一个文本,这个文本便是你项目的字典(假如没有,自己研讨下)

之后,在游戏发动的时分完成以下过程:

1、载入字典txt,一切的文字放到一个string里边(暂时叫做languageString)

(3.0曾经版别)

2、经过大局装备或许其他任何办法,找到你的UIFont变量font(能够在恣意的label上直接获得)

3、调用font.dynamicFont.RequestCharactersInTexture(languageString, font.dynamicFontSize, font.dynamicFontStyle)

(3.0(含)今后版别)

2、经过大局装备或许其他任何办法,找到你的动态字体Font变量font

3、调用NGUIText.RequestCharactersInTexture(font, languageString)

应该就能够了。

问题的根本原因不是很了解,可是我想问题应该呈现在动态字体创立的texture巨细上。

一般问题是呈现在切换界面的时分,所以应该是这个时分,假如texture巨细不行用,从头调整了texture,导致之前的texture的uv对应不上。

经过上面的办法,在游戏最开端就会创立一个2048*1024巨细的texture(我用的是3000多个常用汉字只要不到2M,由所以纯色的图)

所以不会糟蹋太多内存,也比运用bitmap子图省。

供给一个3.0.7的脚本。之前版别的自己看着改吧。

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
using UnityEngine;
using System.Collections;
 
 
/// <summary>
/// SZUI dynamic font problem fix.
/// Usage : attach this to a gameobject or use SZUIDynamicFontProblemFix.DynamicFontProblemFix
/// </summary>
public class SZUIDynamicFontProblemFix : MonoBehaviour {
 
/// <summary>
/// The font. your ttf
/// </summary>
public Font font;
 
/// <summary>
/// The text. your language file
/// </summary>
public TextAsset text;
 
private static bool isFixed = false;
 
private static SZUIDynamicFontProblemFix inst;
private static SZUIDynamicFontProblemFix Inst
{
get
{
if (inst == null)
{
GameObject go = new GameObject(typeof(SZUIDynamicFontProblemFix).Name);
inst = go.AddComponent<SZUIDynamicFontProblemFix>();
}
return inst;
}
}
 
void Awake()
{
if (inst == null)
{
inst = this;
}
if (inst != null && inst != this)
{
Destroy(this.gameObject);
return;
}
DynamicFontProblemFix();
}
 
public static void DynamicFontProblemFix()
{
if (!isFixed)
{
isFixed = true;
NGUIText.RequestCharactersInTexture(Inst.font, Inst.text.text);
}
}
}

原文链接:


主张运用电驴(eMule)下载共享的资源。

阐明
:本教程来历互联网或网友共享或出版商宣扬共享,仅为学习研讨或媒体推行,pvc01.com不确保材料的完整性。
 
上一篇:【Unity C#编程】自定义编辑器(一)  下一篇:Unity将光线追寻技能运用到实时互动游戏