トマシープが学ぶ

Unity/VR/AR/デザイン好きのミーハー 記事内容は自分用のメモです

TextMeshProでOutlineを付けたとき一部の文字のアウトラインが細い【未解決】

問題

TextMeshProで日本語のフォントを漢字とひらがなに分けて、ひらがなの方をMainとして、漢字のFontAssetをFallBackListとして設定して、一つのフォントとして使っています。

bibinbaleo.hatenablog.com



ひらがなの方で、Shadowを付けたマテリアルアセット(NotoSansJP-Regular SDF_UseThis_Shadow)を作りました。

このときShadowを付けたマテリアルアセットを選ぶと、

以下のようにひらがなの一部のアウトラインが細いです。

試行錯誤

FontFallBackしているせいで、FontFallBackに設定しているフォントのほうにアウトラインが適用されていないかと思ったけど、それなら漢字が適用されなくなるはず。

適用されていないのはひらがなだし、そもそも適用されていないというか幅が違うだけでアウトライン自体はちゃんと入ってる・・・

なんで・・・

 

いろいろいじってたらFontAssetのFaceInfoのBaseLineという数字を変えると、アウトラインが細い文字だけ位置が変わった

あとAtlasPopulationModeをいろいろ変えると

全部細いほうになった!

マテリアルをいじっても元の太さを再現できないが、統一はされた。

 

というか、統一されたときの設定、結局元の設定と変わらない。

いったんStaticからDynamicにするとこうなって、

AtlasHeightを別の数字にしてApplyするとギザギザが消えて、また元の数字に戻すとギザギザが消えたまま。

そしてDynamicをStaticに戻すとギザギザが消えて統一された状態になる。

つまり最初の設定と同じなのに、統一された状態になる

 

ChatGPTにも聞いたけど、結局どうしたらいいかはわからない。

TextMeshProのフォントアセットは、フォントの各文字をテクスチャに格納します。このテクスチャは「アトラス」と呼ばれます。`AtlasPopulationMode`は、このアトラスの作成方法を制御します。

- `Static`は、あらかじめ指定した文字全てをアトラスに含めるモードです。このモードではアトラスのサイズは固定されていて、その後の実行時に新たな文字を追加することはできません。

- `Dynamic`は、実行時に必要な文字をアトラスに追加するモードです。最初はアトラスは空で、必要な文字があるたびにその文字をアトラスに追加します。アトラスが一杯になると、新たに大きなアトラスが作成され、そこに全ての文字がコピーされます。

アトラスのサイズ(`AtlasHeight`や`AtlasWidth`)が小さすぎると、文字がアトラスに密集して配置され、文字間の間隔が狭くなります。この結果、文字が互いに接触してしまい、他の文字が映り込んでしまう現象(ギザギザ)が発生します。この現象を解消するには、アトラスのサイズを大きくするか、文字間のパディングを大きくすると良いでしょう。

あなたが実施した手順(`AtlasPopulationMode`を`Static`から`Dynamic`に変更し、その後`AtlasHeight`を変更し、再び`Static`に戻す)は、アトラスの再作成を引き起こしています。この結果、アトラス上での文字の配置が変わり、ギザギザが解消した可能性があります。

しかし、最初の設定に戻したにも関わらず結果が変わったのは、初めてフォントアセットを作成した時点と再作成した時点での具体的なアトラス作成条件(例えば`AtlasHeight`の値やTextMeshProの内部状態)が異なっていた可能性があります。

結果として、TextMeshProのフォントアセットやアトラスの扱いは複雑な部分もあり、試行錯誤が必要な場合があります。これらの設定を調整しながら、最適な結果を得られる設定を探すことをお勧めします。

再びフォントを作り直すしかないのか・・・