【Unity3D】【NGUI】移动设备上使用动态字体Label显示不正确

时间:2021-03-24 10:55:11

NGUI讨论群:333417608

这个博客解决的是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(fontlanguageString)


应该就可以了。


问题的根本原因不是很了解,但是我想问题应该出现在动态字体创建的texture大小上。

一般问题是出现在切换界面的时候,所以应该是这个时候,如果texture大小不够用,重新调整了texture,导致之前的texture的uv对应不上。

通过上面的方法,在游戏最开始就会创建一个2048*1024大小的texture(我用的是3000多个常用汉字只有不到2M,因为是纯色的图)

所以不会浪费太多内存,也比使用bitmap子图省。


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

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);
		}
	}
}