Edited at

Unityでテキストが稀に文字化けする問題

More than 1 year has passed since last update.

追記:

公式の技術情報に掲載されました。

http://helpdesk.unity3d.co.jp/hc/ja/articles/115003102887-%E3%83%80%E3%82%A4%E3%83%8A%E3%83%9F%E3%83%83%E3%82%AF%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88-uGUI%E3%81%A7%E3%81%AE%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91


文字化け問題について

Unityでダイナミックフォントを使ってテキストを描画していると、時折テキストの内容が壊れることがあります。

壊れるといっても、設定されている文字列は正しく、表示される内容だけがおかしくなる、というものです。

実機でもUnityEditorでも発生し、GameObjectのアクティブ/非アクティブを切り替えたりすると直ったりします。

これ、おそらく再現性が取れないが故に開発側でも原因を掴みかねているバグなのではないかと、個人的には思っています。Unity5.1くらいの時代からちょくちょく発生しており、Unity5.4になっても未だに修正されていません。

原因は分からないのですが、以下の方法を入れることで改善の傾向が見られました。

(もし完全に解決する方法をご存知でしたらご教示いただきたいです)

ただしアンオフィシャルな内容ですので、自己責任でお使い下さい。


対処方法


1. Font.textureRebuilt にコールバックを設定する

ダイナミックフォントテクスチャが再生成された時に呼ばれるコールバックです。

コールバックの型は、引数にFontを1つ取ります。


2. コールバックの中で、引数のFontを使っているTextコンポーネントを収集する

マネージャクラス的なもので、現在のシーンにあるTextを全て管理しているなら話は早いのですが、そうでない場合は重いのを覚悟でGameObject.FindObjectsOfTypeなどを使ってください。


3. Text.FontTextureChanged を呼ぶ

手順2で収集したTextコンポーネント全てにFontTextureChangedを呼びます。

textureRebuiltコールバックの中で直接呼んでしまって構いません。