Unityで固定幅ビットマップフォントを使う

2015-06-14
blog
  • Projectペインで Create > Custom Font を選んでフォントを作成する
  • Inspectorペインで見ると、 Character Rects という項目があって、ここにアスキーコードごとにUVを指定してやれば、対応する画像の矩形が使われる。
  • 英数文字のみとはいえ、GUIで手入力するのは辛い…
  • でなんか適当にスクリプトをでっち上げる:
# create_bmfont.rb
require 'erb'

HEADER = <<EOD
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!128 &12800000
Font:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_Name: <%=name%>
serializedVersion: 4
m_AsciiStartOffset: 0
m_Kerning: .100000001
m_LineSpacing: .100000001
m_CharacterSpacing: 1
m_CharacterPadding: 0
m_ConvertCase: 0
m_DefaultMaterial:
m_CharacterRects:
EOD

FOOTER = <<EOD
m_Texture: {fileID: 0}
m_KerningValues: []
m_PixelScale: .100000001
m_FontData:
m_FontSize: 0
m_Ascent: 0
m_DefaultStyle: 0
m_FontNames: []
m_FallbackFonts: []
m_FontRenderingMode: 0
EOD

RECT_TEMPLATE = <<EOD
- serializedVersion: 2
index: <%=char_code%>
uv:
serializedVersion: 2
x: <%=uv_x%>
y: <%=uv_y%>
width: <%=uv_w%>
height: <%=uv_h%>
vert:
serializedVersion: 2
x: <%=vert_x%>
y: <%=vert_y%>
width: <%=vert_w%>
height: <%=vert_h%>
width: <%=width%>
flipped: 0
EOD

def main(name, w, h, start)
print ERB.new(HEADER).result(binding)

vert_x = vert_y = 0
vert_w = 16
vert_h = -16
width = 160
uv_w = 1.0 / w
uv_h = 1.0 / h
rect_erb = ERB.new(RECT_TEMPLATE)
h.times do |iy|
uv_y = (h - 1 - iy) * uv_h
w.times do |ix|
uv_x = ix * uv_w
char_code = ix + iy * w + start
print rect_erb.result(binding)
end
end

print ERB.new(FOOTER).result(binding)
end


if $0 == __FILE__
main('BitmapFont', 16, 8, 32)
end
  • 使い方:
    • $ ruby create_bmfont.rb > foobar.fontsettings
  • などとして.fontsettingsに保存して、Unityに読み込ませる
  • uGUIのTextFontでフォントを指定
  • そのままだと縁取りまで真っ白になってしまうので、マテリアルでShaderUI/Unlit/Transparentを指定してテクスチャにフォントのビットマップ画像を指定したものをTextMaterialに指定する

スクリーンショット 2015-06-14 8.43.04.png

  • フォントサイズとかはないので、拡大縮小したい場合にはスケールを変更する
  • フォントの高さがちゃんと設定されてないのか、改行してもY座標がそのままになってしまうのは要修正…