naichi's lab

3日後の自分(他人)への書き置き

【Unity】TextMeshProで特定文字の位置がずれる

環境

  • Unity 2019.1.5f1
  • TextMeshPro 2.0.1

症状

TextMeshProでUIを作っていたところ、特定の文字がズレて見えました。

下記画像の が下がって見える

f:id:naichilab:20190718012635p:plain:w320

ざっと調べてなぜズレるのか分かったのでまとめておきます。

再現手順

日本語フォントを用意

  • 使ったのは mojimo gameさんの UD丸ゴ_スモール-B
  • UnityのAssetsフォルダに入れておきます。
  • 事前にIllustratorで確認したのが下記画像です。
    • f:id:naichilab:20190718011953p:plain:w320
  • とても綺麗なフォントですね。

TextMeshProのフォントアセットを作る

  • Window -> TMPro -> Font Asset Creator
  • 設定はこんな感じ
    • f:id:naichilab:20190718010952p:plain:w320
    • Sampling Point Sizeは32にしました。
      • 2048*2048に日本語全部入れようとするとこのサイズが限界のため
    • (実際は漢字含む大量の文字を含みます)
  • Generate Font Asset して Save

TextMeshProTextを配置

  • HierarchyにてCreate -> UI -> Text
  • 作成したフォントアセットを選び、テキストに もちもの と記入
    • f:id:naichilab:20190718011411p:plain:w320
  • が下がってますよね。
    • f:id:naichilab:20190718011632p:plain:w320

原因

GlyphTableのBYによるズレ

  • このズレは作成した FontAssetGlyph Table にある、 BY の値が関係していました。
    • f:id:naichilab:20190718023034p:plain:w320
  • 適当に変えてみると文字が移動することが確認できます。
    • f:id:naichilab:20190718023749g:plain:w320

Sampling Point SizeBY の関係

  • Font Asset CreatorSampling Point Size を変えながらいくつか作ってみました。
    • Sampling Point Size Glyphサイズ BY
      32 27 * 29 26
      64 53 * 57 52
      128 105 * 112 103

BY自体には小数を入れて微調整できるものの、Font Asset Creatorで作られた直後のアセットでは必ず整数値が入ってしまうようです。

この小数から整数への丸め誤差がズレの原因と思われます。

対策

A. Sampling Point Sizeを大きくする

Font Asset作成時のフォントサイズを大きくすれば、小数から整数に変換される誤差は相対的に小さくなるので、ズレは目立たなくなります。

f:id:naichilab:20190718030026p:plain:w320

使用する文字種が少なければ、大きいサイズで作成しておけば良さそうです。

B. Font Fallbackを活用する

【Unity】TextMeshProにFont FallbackとDynamic SDF Systemが追加、日本語が使いやすくなった。 - テラシュールブログ

TextMeshPro 1.4から Font FallbackDynamic SDF という仕組みが使えるようになりました。

複数のFontAssetを組み合わせることができるので、

  1. UIなど、綺麗に表示したい限られた文字は大きめフォントサイズで作成しておく
  2. 漢字を含む日本語フォントなど、文字数が多いものはフォントサイズ小さめで作成しておく(ズレを許容する)

前者に存在しない場合のみ後者を使うようにすれば、UI上での文字ズレは目立たなくできそうです。

後者のフォントは Dynamic SDF System で生成してもよいかもしれません。

C. FontAssetCreatorに手を加える

最近のTextMeshProはPackageManager経由で導入されるので、ソースコードが同梱されてます。

FontAsset作成処理に手を加えればBYの値を整数ではなく小数値で作成できるのではと思います。(私は断念しました)

D. TextMeshProの更新を待つ

標準でズレなく表示できるようになるのを待つ。

(フォーラム検索しても同様の問題みつけられませんでした・・・誰も困ってない??)

おわり

ググっても全くと言っていいほど出てこなかったのですが、この症状は誰も困ってないんでしょうか?

なんらか情報お持ちでしたら教えていただけると嬉しいです。