Mapz's Blog

可以递归的函数指针

Unity学习:FC中抠出来的字体做成BitmapFont

做像素游戏的时候,你通常会自定义字体,或者绘制像素字体。

字体画好,或者像我们一样直接从 FC 游戏里面抠出图集来之后,怎么样来做成BitmapFont呢?

网上的内容通常教你怎么从安装好的ttf来导出,现在我们手上只有 PNG 怎么办呢?

用到的工具

  • BMFont
  • Unity

假设

  1. 我们的字符图集中文字大小都是 8 X 8,并且无间隔(也可以是其他大小,总之Unity可以自动按格子大小来切就行)

步骤

  1. 我们从FC Dump 下来的字体图集,一般都是8x8的字符集,为了能够使用BMFont来导出Bitmap Font,我们需要先把这个图集打成单个的字符。
  2. 打开 Unity,导入字符集图片,导入设置为 压缩->无,并把可读写打开,Sprite类型为多个
  3. 打开 Sprite Editor ,切片方式 By Cell Size 大小 8 x 8,切好图集
  4. 使用如下脚本导出为单个的图片
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
using UnityEditor;
using UnityEngine;
static class BitmapFontTool {
[MenuItem ("BitmapFontTool/导出切好的Sprite")]
static void SaveSprite () {
//每一张贴图类型Advanced下 Read/Write Enabled打上勾才能进行文件读取
//导入类型不能是压缩过的
string bitMapfontPath = @"Assets/BitmapFontTool/";
foreach (Object obj in Selection.objects) {

string selectionPath = AssetDatabase.GetAssetPath (obj);
string selectionExt = System.IO.Path.GetExtension (selectionPath);
string fileName = System.IO.Path.GetFileNameWithoutExtension (selectionPath);
string loadPath = selectionPath.Substring (0, selectionPath.Length - selectionExt.Length);
if (selectionExt.Length == 0) continue;

//加载此文件下的所有资源
Object[] spriteList = AssetDatabase.LoadAllAssetsAtPath (selectionPath);

if (spriteList.Length > 0) {
//创建导出文件夹
string outPath = bitMapfontPath + "/SpriteExportOutput/" + fileName;
System.IO.Directory.CreateDirectory (outPath);

foreach (var sprite in spriteList) {
try {
var sprite_ = (Sprite) sprite;
Texture2D tex = new Texture2D ((int) sprite_.rect.width, (int) sprite_.rect.height, sprite_.texture.format, false);
tex.SetPixels (sprite_.texture.GetPixels ((int) sprite_.rect.xMin, (int) sprite_.rect.yMin, (int) sprite_.rect.width, (int) sprite_.rect.height));
tex.Apply ();
//写出成png文件
System.IO.File.WriteAllBytes (outPath + "/" + sprite_.name + ".png", tex.EncodeToPNG ());
Debug.Log ("SaveSprite to" + outPath);
} catch (System.Exception e) {
Debug.Log (e);
}

}
Debug.Log ("保存图片完毕!" + outPath);
}
}
// }
}
}
  1. 网上搜索 BMFont 教程,按教程使用导出的图片,创建 fnt 字体
  2. 把输出的文件导入 Unity ,下载 BitmapFontImporter 插件
  3. Assets -> Bitmap Font -> build 创建 Unity 自定义字体
  4. 使用字体

缺点

  1. BMFont 导入大量图片文件的时候非常的难用,不适合批量使用
  2. 既然已经有图集了,何不在图集上自己创建fnt文件呢?

思考

在Unity下,自己写个工具来制作fnt也并不难
挖个坑留着以后来尝试