在Unity中,如果指定的字体不包含某个字,Unity就会从 自带的 Arial 中读取字形来创建这个字,本意是好的,但是总是会有问题。
在我们游戏中就有这样的问题,自己制作的微软雅黑字库不包含繁体字,Unity 就会用 Arial 来补全显示。这样看起来很怪。
文章转自http://blog.csdn.NET/huutu http://www.thisisgame.com.cn
我一开始是猜测 我们字库不包含繁体字的。想起来之前做过 Freetype ,于是拿起 Freetype 来做一个验证,通过 Freetype 返回的数据 是否为空,来判断这个 字 在字库中是否存在。
主要是这段代码
-
- 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)
- {
-
-
- FT_Load_Glyph(m_FTFace, FT_Get_Char_Index(m_FTFace, ch), FT_LOAD_DEFAULT);
-
-
- FT_Glyph glyph;
- FT_Get_Glyph(m_FTFace->glyph, &glyph);
-
-
-
-
- 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_New(&targetBitmap);
-
- if (bitmap.pixel_mode == FT_PIXEL_MODE_MONO)
- {
-
- 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