ばかおもちゃ本店:Youtube twitter:@sashimizakana Amazon.co.jpアソシエイト

2019年9月24日火曜日

Defoldで日本語のテキスト周りあれこれ

Defoldでも日本語のフォントを普通に使うことができる。
otfとかttfのファイルをassetsフォルダみたいなところに入れておいてからNew>fontで.fontファイルを作成すれば、ゲーム内部で利用できるようになる。フォントの大きさとか、字詰・アルファ・影の設定とかはここでやるっぽいので、fontファイルはスタイルみたいなもんだろうと思う。複数のスタイルを使うときはその分だけ作成すれば良さそう。
注意点としてはAll Charsというチェックを入れておかないと日本語フォントは入らない。

もうちょっと文字周りのことに触れておくと、Defold自体が利用する文字エンコードは多分UTF-8っぽいのだけど、適当に読む限りLuaは単純にバイト列として読むだけなのでエンコードの変換とかは特に行われない、つまり内部文字コードみたいなものを持たないっぽい。たしかこれはRubyなんかも同じような作りだったような気がするけど詳しくないので知らない。
で、Defold使っていて、シナリオデータをJSONとかで作ったりすると、当然読み込まれた文字はUTF-8になるわけだけど、よくあるテキストボックスに文字をぺぺぺってタイプライターみたいに打っていく表現をしようと思うと、文字を一文字ずつ切り分けるということが必要になります。

当然Luaにもstring.subみたいな文字を切り出す処理があるのでそれを使うわけですが、たぶん上述のような理由でLuaは文字がどんな感じで格納されているかに関知しないので、subは指定バイト数で文字を切り出す、という仕様。
UTF-8の場合雑に言うと、英数は1バイト、アクセントとかウムラウトみたいなのついてるのは2バイト、日本語等全角文字と古い絵文字っぽいものが3バイト、昨今の絵文字とその他あれこれが4バイトみたいになっています。ちなみにそれぞれが何バイトかは文字の先頭4ビットを見ればわかる。
つまり、そのままUTF-8を利用して文字単位で切り出そうとすると、(DefoldのLua5.1の場合)そういう処理を実装する必要があるわけですが、ちょっと面倒くさかったので、先頭1バイトだけ読んで読めなければ固定で3バイト分読むという方針で実装していたところ、ツイッターで教えてもらいました。


立て続けに二人に教えてもらいました。


どっちもライセンス表記見ると同じ人が書いたっぽく、後者の方が機能が多い。

で、これを New > Lua moduleとやって、コピペしてutf8.luaみたいな名前で保存して、require 'フォルダ名.utf8'とやれば、普通に使えるようになった。

そういうわけで、Defoldの利用者には大変親切な方が多いです。