在Unity中,如果指定的字体不包含某个字,Unity就会从 自带的 Arial 中读取字形来创建这个字,本意是好的,但是总是会有问题。
在我们游戏中就有这样的问题,自己制作的微软雅黑字库不包含繁体字,Unity 就会用 Arial 来补全显示。这样看起来很怪。
文章转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn
我一开始是猜测 我们字库不包含繁体字的。想起来之前做过 Freetype ,于是拿起 Freetype 来做一个验证,通过 Freetype 返回的数据 是否为空,来判断这个 字 在字库中是否存在。
主要是这段代码
//读取一个字,创建Character;
bool getCharacter(wchar_t ch)
{
if (m_character[ch].x0 == 0 &&
m_character[ch].y0 == 0 &&
m_character[ch].x1 == 0 &&
m_character[ch].y1 == 0)
{
//Glyph:字形,图形字符 [glif];
//加载这个字的字形,加载到 m_FTFace上面去;
FT_Load_Glyph(m_FTFace, FT_Get_Char_Index(m_FTFace, ch), FT_LOAD_DEFAULT);
//从 m_FTFace上面读取这个字形 到 glyph 变量;
FT_Glyph glyph;
FT_Get_Glyph(m_FTFace->glyph, &glyph);
//根据字体大小决定是否启用反锯齿;
//字体较小建议使用FT_Render_Mode_Mono;
//>12建议使用FT_Render_Mode_Normal;
if (!(ch >= L'0' && ch <= L'9'))
{
FT_Glyph_To_Bitmap(&glyph, ft_render_mode_normal, 0, 1);
}
else
{
FT_Glyph_To_Bitmap(&glyph, ft_render_mode_mono, 0, 1);
}
FT_BitmapGlyph bitmapGlyph = (FT_BitmapGlyph)glyph;
//返回引用;
FT_Bitmap& bitmap = bitmapGlyph->bitmap;
FT_Bitmap targetBitmap;
//创建了新的 FT_Bitmap;
FT_Bitmap_New(&targetBitmap);
if (bitmap.pixel_mode == FT_PIXEL_MODE_MONO)
{
//如果Convert成功;
if (FT_Bitmap_Convert(m_FTLibrary, &bitmap, &targetBitmap, 1) == 0)
{
for (unsigned char* p = targetBitmap.buffer, *endP = p + targetBitmap.width*targetBitmap.rows; p != endP;++p)
{
*p ^= -*p ^ *p;
}
bitmap = targetBitmap;
}
}
//如果没有数据;
if (bitmap.width == 0 || bitmap.rows == 0)
{
return false;
}
else
{
return true;
}
}
}
工程打包下载:
http://pan.baidu.com/s/1jHyJirO