何も思いつかないのでTMPの話をする【Unity】
はじめに
メリークリスマス!!
2023年度RiG++アドカレの最終日がやってきました。伝統に則り最終日の記事を担当するのはこの私、団体長のTenです。ダイジョーブダイジョーブ日が昇るまでは12/25って言い張れるから。
ということで、何の記事を書くか考えていたのですが、何も思いつきません。というかこの記事で全て出し切ったので、何も考えたくありません。
まあ、なんか適当に軽~いUnityの話でもできればな、と思います。
閑話
はい、さっそく尺稼ぎの無駄話としゃれ込むのですが、私昨日一昨日と東京ビッグサイトで開催されていた、グラブルフェス2023に両日参加してきました。一晩経っても興奮さめやらないので、すこ~しだけお付き合い下さい。
さて1日目ですが、ありとあらゆる列に並び続けた1日でした。朝一寝坊して5時発の予定が7時発になり、入場まで約2時間並び、アトラクションに直行して50分並び、物販待機列で2時間並び、昼食のカフェで50分並び、予約していたVR体験で50分並び……。まあ人が多いので仕方ないんですけど。
しかも、並んでいる間にもYoutubeライブでメインステージの中継を見ることができるので、何も問題ありませんでしたね。1日目の見所はやはり3Dモデルによるキャラクターライブとオフィシャルキャストさんによるファッションショーでしょう。僕は両方とも座席が取れたので現地でしたが。
2日目は1日目に用事を済ませていた分、あまり並ばない快適な1日でした。その分オフィシャルキャストさんを追いかけ回したり、メインステージを見に行けたりと大満足です。Stella Magnaのライブで座席が取れなかったのだけが心残りです……。2日目の見所はそんな Stella Magnaのライブと(生放送)、Night Partyでしょう。Night Partyはかなり前列の座席を取れた上、演出が良すぎて目から汗が……。
さて、なんで終わったイベントの話を語っていたのかというと、実はメインステージの中継はYoutubeにアーカイブが残っているんですよね。つまり何がしたいのかというとシンプルにグラブルの布教がしたいだけです。年に1度このレベルの還元イベントをしてくれるグランブルーファンタジー、一緒に推さないか。
本題
閑話休題。というか個人的には既に満足なのですが、このままだとさすがにぶん殴られる気がするので、ちゃんと技術的な話をします。
といってもマジで何にも思いつかなかったので、かなり初歩的なお話にはなりますが、TMPことTextMeshProについて紹介しようと思います。
TextMeshProとは
TextMeshPro(以下TMP)とは、今のUnityの標準テキスト表示機能です。UIのTextやMeshのTextを未だに使っている方は今すぐに乗り換えましょう。奴らは既にLegacy(遺産、というか旧式)だ。
今回はそんなTMPでも、特に使用頻度の高いUI方面、TextMeshProUGUIについて軽く紹介します。
なにができるのか
UIとして使うTMPですが、テキストを表示するだけならば、LegacyのTextと大差ありません。
では何が違うのかというと、TMPの方はテキストをカスタマイズすることができます。
例えば、文字全体にテクスチャを入れて文字を装飾することができます。
他に、HTMLのような書き方でテキストにタグ(装飾や配置変更、リサイズ)を付けることができます。
他にも様々なカスタマイズができるのですが、キリが無いので割愛します。興味のある方は調べてみて下さい。
どうすれば使えるのか
え、普通に「UI/Text – TextMeshPro」じゃね……?と思われるでしょうが、それだけで使えるのはデフォルトのフォントだけです。
ゲーム開発においてデフォルトのモノを使用するのは、少し抵抗がありますよね。そもそもTMPに関してはデフォルトだと日本語使えないし。
つまり何をするのかというと、フォントアセットを作ります。ここが、TMPの少し面倒なところなのですが、TMPではフォントを一度フォントアトラスに圧縮して使用するので、LegacyのTextで使えていたttfやotfのフォントは使えません。
じゃあそのフォントアトラスはどうやって作るんだよ。という話ですが、2つのパターンがあります。
1つ目は、動的フォントを使う方法です。
動的フォントを作るのは簡単で、Projectビューのフォント(ttfやotf)の上で右クリック→「Create/TextMeshPro/Font Asset」です。
これだけで動的フォントアセットが作成されます。
この動的フォントアセットとは、ゲーム中に使用する文字に応じてフォントアセットを作成するモードとなります。つまりは上の操作でフォントアセットを作成した時点では、フォントの中身にはどの文字も入っていません。ゲーム中に実際に文字が使われる際に、アトラスを再生成してフォントアセットに反映します。
動的フォントのメリットは、必要な文字のみを作成することで、フォントアセットの容量を極限まで小さくすることができます(フォントアセットは雑に作ると簡単に100MB超えてGitに上げられなくなります)。
デメリットは、ゲーム実行中にリアルタイムでフォントを作成するため、動作が安定しないということです。具体的には結構高頻度で「□□□□□」みたいな表示になります。特にスクリプトから表示テキストを切り替える際に頻発するので、要注意です。
さて、2つ目ですが、動的の逆、静的フォントです。
こちらは、動的フォントとは違い、あらかじめ指定した全ての文字が入ったアトラスを持つフォントアセットを作成し、ゲーム中で使用します。
静的フォントアセットの作成方法ですが、「Window/TextMeshPro/Font Asset Creator」から、 Font Asset Creatorを開き、基になるttfやotfなどのフォント、生成する文字、各種設定を指定し作成します。
Font Asset Creatorでは特に日本語用のフォントアセット作る際、Custom Character Listのテキストボックスに大量の文字を打ち込むのですが、こちらのテキストファイルで大体網羅しているはずなので、もし良かったら使って下さい。
さて、そんな静的フォントのメリットですが、動的フォントと違い動作が安定していることが挙げられます。当然、あらかじめ完成されたアトラスを用意しているので、安定動作するというわけです。
デメリットとして、上の複雑な手順を踏む必要がある上、時間もかかる他に、容量が大きいなどが挙げられます。容量については生成する文字を絞るなどの工夫で多少は改善しますが、それでも注意しなければいけません。
これらを考慮した上で、私は静的フォントをオススメしますがね。
おわりに
いかがだったでしょうか。本当に軽~くしか紹介していないので、TMPを実際に使用する際は、改めてTMPについて調べるようにして下さい。
さて、20日以上続いていたRiG++2023年度アドカレですが、この記事をもって最後となります。最後の記事が半分趣味の話で本当に良いのか。いや、良い。
思えば今年も多種多様な記事が上がりましたね。もしまだ読んでいない記事があれば、是非読んでみて下さい。きっと、どれもためになる記事のはずです。多分。
ということで、RiG++アドカレ2023終了です。ここまで読んで下さった皆様、本当にありがとうございました!