Suzerain の日本語化 ② UABEAの使い方とフォントデータの解析 | ブリッツのブログ

ブリッツのブログ

模型とゲームの話が中心です。

前回①のXUnity.AutoTranslatorがあれば、多くのゲームが簡単に日本語化できるようになるでしょう。

また次回取り上げるつもりのBlackSadはこれだけで十分に動きますが、翻訳に時間がかかりQTEのタイム制限に間に合わなかったりします。

そして、今回のSuzerainでは、一部のテキストがフォントが間に合いません。なので□□□□が表示されます。

代替フォントとオリジナルのフォントの切り替えをしてやると読めるようにはなるのですが、とても煩わしです。

 

 

Alt+Fを押して代替フォントをON/OFFしてやると

読めるようにはなる。ただ、非常に煩わしい。

 

と言う事で、フォントを日本語化することに挑戦します。

 

注:言葉を正確に知りませんので、ここで言葉を定義しておきます。ややこしいようなら、指摘してください。

テクスチャファイル、テクスチャ画像 : 文字の絵が描きこまれた画像ファイルの事。

グリフ画像:テクスチャ画像からい切り出した、各文字の画像のこと

ダイナミックフォント:Unityに新しくは言った機能で、定義されていない文字はその場で作る機能が出来ました。そのフォントの事をダイナミックフォントと言います。事前にフォントを全て用意する必要がなくファイルを縮小することが可能となります。

 

今まで、UnityExで抜き出したものをバイナリエディタでちまちまと解析していたのですが、

今回UABEAなるものを知りました。

 

こいつはUnityEXのように抽出、パックができるですが、最高にうれしい機能が

ExportDumpとInportDumpです。

今までUnityEXでは、フォント情報を抜き出してもバイナリで調べなくてはならなかったのが、こいつはきちんとした情報付きのテキストデータとして出力されます。 しかもそのテキストデータをまた書き戻すことが可能なのです。

 

簡単な使い方から

まず、書き換え用フォントをUnityで作る必要があります。

Textmesh proのフォントの作り方は、

 

ここを参考にさせてもらいました。(ただし日本語のデータは下記から貰いました。)

 

今回のゲームでは、テクスチャー画像が4096x4096ではエラーが出ましたので2048x2048にしています。

そのため文字のポイントサイズが16じゃないと収まらず。ぼけたフォントになってしまいました。

後日、不要なフォントを間引き、もっときれいなフォントにする予定です。

 

UABEAでUnityで作ったフォントが入っているアセットを開てい見ると。

 

Mpuls1-Regular SDF 4096 Atlas :Texture2D

Mpuls1-Regular SDF 4096         :MonoBehaviour

というファイルが見つかります。(写真は、4096で作った時の物です。)

Texture2Dはフォント画像が入っている画像ファイル。

MonoBehaviourはフォント座標が入っているグリフ?ファイルです。

UnityEXを使ったことがある人はわかると思います。

MonoBehaviourのファイルが名前でわかるのはとても便利です。

 

で、ここで注意点です。Mpuls1-Regular SDF 4096 Atlas :Texture2DはUnityEXのExport with convertで抽出しました。

EXportRawで抽出したものはデータが壊れるのかうまく行きませんでした。

 

Mpuls1-Regular SDF 4096         :MonoBehaviourはExport Dumpで抽出します。

 

 

細かな事は色々と調べてもらうとして。

大切そうな事だけを忘備録を兼ねて残しておきます。

 

FileID 、PathID  アセット内のファイルの識別番号です。各ファイル固有でこれをもとにファイルを探すようです。

FileGUID  Unity内での識別番号のようです。(ソフトとしてコンパイルされたらもう用は無さそうです。)

 

フォントのマテリアルファイルの場所をを示しています。(これは書き換えなくてもOKの様です。)

0 PPtr<Material> material
  0 int m_FileID = 0
  0 SInt64 m_PathID = 5
 0 int materialHashCode = -1443011765

 

 1 string m_Name = "Mplus1-Regular SDF4096" 

このファイルの名前です。

これを書き換えるとUABEAの表示も変わります。ソフト内ではPathIDで識別しているのでこれをAA〇〇〇としておくとファイルを探すときに便利です。(Dumpしたものを書き換えても戻しても問題なさそうです。)

 

0 PPtr<Font> m_SourceFontFile 

フォントの元になったTTFファイルのPathIDです。(一緒に書き込んでいた場合。)

ダイナミックフォントを使う場合は必要成るのではないでしょうか?

------------------------------------

25-41行、フォント(グリフ)の大きさ、行送りなどの基本情報です。 (書き換えるときは、新しく作った方を使います。)

------------------------------------

 1 Array m_GlyphTable (5645 items) 

フォント(グリフ画像)のテクスチャ画像ファイル上での位置情報です。

[0](一文字目)から各フォント(グリフ画像)の情報が記載されています。

数字は文字数で、今回の場合[5644]まであります。

注目してほしいのが、

    0 unsigned int m_Index = 〇〇

このグリフ画像はこのIndex値で管理されます。この文字画像が使いたければこのIndex値を指定します。

------------------------------------

 

 

 1 Array m_CharacterTable (5645 items)
  0 int size = 5645
  [0]
   0 TMP_Character m_CharacterTable
    0 int m_ElementType = 1
    0 unsigned int m_Unicode = 32
    0 unsigned int m_GlyphIndex = 715
    0 float m_Scale = 1

 

どの文字コードがどのグリフ画像を使うかを決めています。

    0 unsigned int m_Unicode = 32 これがUnicode文字番号 10進数で記載してあります。 これは、スペース(&H20)ですね
    0 unsigned int m_GlyphIndex = 715  このIndex番号のグリフ画像を使います。

------------------------------------

 

 

 1 Array m_AtlasTextures (1 items) (あとで出ますが、これが切り分け位置となります。)

ここのPathIDで指定されたファイルがフォント画像のファイルです。8とありますので、上のUABEAの写真で確認すると、Mpuls1-Regular SDF 4096 Atlas :Texture2Dになっているのが分かります。

各フォントに同じ画像を使う場合、ここを変更するのもやり方の一つです。(今回は後述するFallback方法を使いました。)

------------------------------------

1 bool m_IsMultiAtlasTexturesEnabled = false
 1 bool m_ClearDynamicDataOnBuild = false

この二つは、マルチテクスチャ(ダイナミックフォント時にテクスチャが足りなくなった場合に自動でテクスチャを足す機能)用です。

今回は使いませんので削除します。

 

------------------------------------

このあとは、あまり重要なものは出てきません。

1 Array m_UsedGlyphRects 

1 Array m_FreeGlyphRects 

テクスチャファイルのどの部分を使っているか、使っていない(空きスペース)のかを示す情報です。

(ダイナミックフォントを使う場合は使うのでしょうか?)

------------------------------------

0 FaceInfo_Legacy m_fontInfo

旧Textmesh proの情報表示方法でしょうか。互換性を持たせるためにでもあるのかな?

使われていない可能性が高いです。

------------------------------------

0 PPtr<Texture2D> atlas
  0 int m_FileID = 0
  0 SInt64 m_PathID = 0
 0 int m_AtlasWidth = 4096
 0 int m_AtlasHeight = 4096
 0 int m_AtlasPadding = 5
 0 int m_AtlasRenderMode = 4165

ここも気になりますが、使われていないかな? 

------------------------------------

0 KerningTable m_KerningTable
  1 Array kerningPairs (0 items)
   0 int size = 0
 0 TMP_FontFeatureTable m_FontFeatureTable
  1 Array m_GlyphPairAdjustmentRecords (0 items)
   0 int size = 0
この二つは使われていますが、まだ未検証(今回使われていないので)

------------------------------------

 

1 Array m_FallbackFontAssetTable (1 items)
  0 int size = 1
  [0]
   0 PPtr<TMP_FontAsset> m_FallbackFontAssetTable
    0 int m_FileID = 0
    0 SInt64 m_PathID = 14

 

ここは重要です。このフォントファイルにない文字があった場合、他のフォントファイルを探しに行くかの指定をします。

PathIDで指定したフォント情報(MonoBehaviour)を読みに行きます。

(ここではPathID=14 LiberationSans SDF - Fallbackを指定しています。)

------------------------------------

 0 FontAssetCreationSettings m_CreationSettings

フォントを作製した時の設定が記録されています。(消してもOK)

 1 Array m_FontWeightTable (10 items)~

------------------------------------

最後にある

1 Array fontWeights (0 items)

  0 int size = 0
 0 float normalStyle = 0
 0 float normalSpacingOffset = 0
 0 float boldStyle = 0.75
 0 float boldSpacing = 7
 1 UInt8 italicStyle = 35
 1 UInt8 tabSize = 10
までは、どれも同じようです。

 

フォントの解析が終わったので、次回はゲーム用フォントを作っていきます。