« Windows版/Android版文字の取り扱い | メイン | Android のフォントを C++ から利用する »

2016年11月25日

吉里吉里Z 開発:: デフォルトフォントの選択

    

吉里吉里2ではMS Pゴシックがデフォルトで、吉里吉里Zも初期は同じようになっていた。
多言語対応でそれでは困るということから、日本語環境ではそのまま、他の環境では DEFAULT_GUI_FONT (メニューやダイアログボックスのような UI の既定のフォント)がデフォルトとなるようにした。

Android では、/system/fonts/ 内に各種フォントファイルがあり、fonts.xml/system_fonts.xml/fallback_fonts.xml と言ったファイルに使用されてるフォントが記述されている。
ただ、xml ファイルの方は Android のバージョンによって異なり、少なくとも 4.X と 5.0 以降では記述方法が変わっている。
Android アプリでは Typeface クラスを用いてフォント指定を行うので、このクラスからファミリー名等が取得できればそこから fonts.xml 等の違いを気にせずフォントを取得できるが、残念ながらそれはできない。
Typeface クラスはほとんど情報を公開しない。
では、やはり fonts.xml 等を自前で解析し、各バージョンに対応するべきか?
これは将来的にまた記述が変わった時動作しなくなってしまう問題をはらむので、避けた方が良いと考えられる。

一番安全なのは assets に使用するフォントを入れて、それをデフォルトとすることなので、この方法を推奨しつつ、指定されない場合はロケールによってほぼ決め打ちにする。

まず、Font クラスにスタティックメンバで以下を追加する。
Font.addFont(filename) : facename[] (freetype でのみ有効。指定ファイルが持つフォントを内部の管理領域へ追加する)
Font.defaultFaceName (変更してもこれ以前に生成されたレイヤー等には影響しないので、変更する場合は Window 生成などより前に設定する必要あり)
この2つのメソッドとプロパティによって、スクリプトで assets のフォントを読み込み、デフォルトフェイス名を変更することで、assets に入れたフォントがデフォルトで使われるようにできる。
assets に入れないがロケールの影響を無視して日本語表示したい場合は、以下に記述しているファイルを読み込ませ、それをデフォルトとすればよい。
フォント決め打ち設定はスクリプト実行より前に行うので、スクリプトで変更すれば問題ない。

Windows 版の IME で使用されるフォントがレイヤーで指定されたフェイス名で生成できない時は、DEFAULT_GUI_FONT で設定されているフォントが使用されるように変更する。
昔は動作不定となっていたが、デフォルトフェイス名変更によって IME で設定失敗する率が高まるので、動作を妨げない対応を追加した。

決め打ちのフォントは Locale.getDefault().getLanguage() によって設定する。
ja : NotoSansJP-Regular.otf > MTLc3m.ttf > MTLmr3m.ttf
zh-Hans : NotoSansSC-Regular.otf : 簡体字(中国)
zh-Hant : NotoSansTC-Regular.otf : 繁体字(台湾)
その他 : DroidSansMono.ttf

設定は上記4種のみ。
ja の時は Noto 優先で、なければモトヤフォントとなる。
見付からない場合は、/system/fonts/ を検索して最初に見つかった適していそうなフォントにしてしまう。
それでもなければ DroidSansMono.ttf を設定する。
DroidSansMono.ttf もない場合は、/system/fonts/ にある最初に見つかったフォントにする。
Note かモトヤフォントはあると思われるので、そのどちらかに決まるはず。

ロケールとゲームで表示する言語は別である可能性もある。
ゲームではデフォルトのフォントに頼らず、自分でフォントを設定することが推奨される。

システムのロケールとは別にエンジンロケールの設定の追加も検討中。
ただ、エラーメッセージの問題がある。
エラーメッセージが多言語化されると、システムのロケールでメッセージが確定するので、その言語に従ったフォントが必要となる。エラーメッセージが内部の LogCat とファイルにのみ書き出されるのであれば、気にすることではないが。
この辺りの問題については、初期バージョンは気にせず、のちのバージョンで対応を検討している。


投稿者 Takenori : 2016年11月25日 19:21




comments powered by Disqus
Total : Today : Yesterday : なかのひと