在NGUI中使用bmfont合并数字图片成自定义字体及渲染优化
在传统的字体显示场景中,通常会使用系统的 TTF 字体。若需要实现更多特殊效果,常见的做法有以下几种:
- 寻找特效 TTF 字体:直接在网络上搜索带有特效的 TTF 字体。此方法的优点是操作简单,但具有一定盲目性,有时可能无法找到符合需求的 TTF 字体。而且,如果仅需自定义少数文字,TTF 文件往往会相对较大。
- 合并文字为图片:将需要显示的文字合并成一张图片,在程序中根据单个文字图片的名称进行显示。这种方法适用于文字数量较少的情况。
- 使用 Bmfont 工具:利用 Bmfont 工具把需要显示的文字生成 FNT 和 PNG 文件。该方法适用于事先明确需要显示哪些文字的场景。
- 自定义 TTF 文件:适用于需要自定义大量文字的情况。
在本次需求中,美术人员希望在显示伤害数字时呈现自定义字体效果,具体效果可参考下图,其中红色和白色数字即为期望显示的效果。
具体实现步骤
1. 下载并使用 Bmfont 工具
首先,下载 Bmfont 工具。运行该工具后,选择“Open Image Manager”。打开后的界面如下: 打开界面后,点击“Image”,选择“importImage”,选择所需图片后会弹出对话框。在对话框中,“id”需填写鼠标移动到要显示的数字上时右下角的左边数字。
接着,在“options -> font settings”中设置所需的字体和大小;在“export options”里,根据实际显示的图片大小设置生成的纹理图片大小、图片格式(如 PNG、TGA)以及文字信息格式(如 TXT、XML)。设置完成后,按“Ctrl + S”或者选择“save bitmap font as”,生成的文件将包含 FNT 和 PNG。
为了降低渲染批次,我们可以将多套数字图片合并在一起,最终生成如下图片。关于具体如何读取指定的数字图片,将在文章后续详细介绍。
2. 在 Unity 编辑器中操作
在 Unity 编辑器里,选择“NGUI -> open bitmap font maker”。将前面生成的 FNT 文件拖动到“font data”区域,PNG 图片拖动到“texture”区域,在“atlas”中选择指定的 Atlas,然后点击“create the font”,即可生成文字 Prefab,效果如图所示。
需要注意的是,如果前面使用 Bmfont 工具时出现问题,可能会导致生成的 Prefab 缺少“sprite”选项,如图所示。若出现这种情况,将其放置到 UILabel 中时将无法显示,且不会报错。因此,务必确保这一步的效果与图片一致。
使用时,将生成的 Prefab 拖动到指定项即可,具体操作可参考下图。
3. 读取指定数字图片
在同一张图片中读取指定的数字,在 Bmfont 工具设置指定的数字图片时,我们将红色数字设置为半角 Unicode,白色数字设置为全角 Unicode。其中,数字全角的 Unicode 需要通过网络查找获取,效果图如下。
在程序中获取 int 数字并显示时,基本思路是根据数字获取对应的 Unicode 编码值,然后将其转换为字符串。具体实现可参考下图。
如果需要显示的内容并非数字,例如字母,其实现思路可参考上述数字的实现方法。
此外,我们还思考了在同一张图片中合并超过 2 套数字图片时的解决方案。可以一套使用原来的 Unicode,另一套使用“@”到“I”的字符编码,以此类推,具体情况可参考下图。