この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
UnityがuGUIのTextを描画するのに色々キャッシュしておくためのクラス、TextGeneratorを使って色々できます。
TextGeneratorとは・何に使えるのか
TextGenerator はTextの描画に使われているらしいです。
uGUIのソースコードは公開されており、 UI/UnityEngine.UI/UI/Core/Text.cs を読んでみると出てきます。
ざっくり言うと Populate
または PopulateWithError
で描画に必要なデータを生成してくれるものです。Populate
には、描画したい文字列とフォントやフォントサイズ、文字寄せ位置などの設定を入れておく TextGenerationSettings を渡します。
普通にTextを使っているぶんには直接これを触る必要は全くないのですが、
文字列がどう描画されるのかを知りたいときに非常にお世話になります。
Textの高さをどのくらいにするつもりか知りたい
チャットのような、文章によってオブジェクトの大きさが変わるものでオブジェクトプーリングを行うときにテキストがどのくらいの高さになるのか知りたくて使いました。
GetPreferredHeight
といういかにもよさそうな関数がありますが、これには現在バグがあるようで、思った通りの結果を返してくれません。
GetPreferredHeight
がいつか使えるようになるまでは文字の高さと何行になるかを求めて自力で計算することになります。
行数を求めたいとき文字数を単純に割るだけでは全角半角混じりの文章にうまく対応できないため、単純な割り算では計算できません。
ここでTextGeneratorに行数を教えてもらう必要が出てきます。
スクリプトリファレンスにもあるようにgeneratorを作ってPopulate
に文字列とテキスト生成用の設定(後述)を渡すと、generatorからVertices や文字情報や行の情報などが得られるようになります。
generatorからほしいのは lineCount
、Textの行数です。
public float GetLineCount(string text, TextGenerateSettings setting){
var generator = new TextGenerator();
generator.Populate(text, setting);
return generator.lineCount;
}
TextGenerationSettingsは文字のフォント、フォントサイズ、領域のサイズなどを指定するためのものです。
スクリプトリファレンスの例のように作って一から代入しても問題ないですが、
Textの GetGenerationSettings
でフォントやサイズを取ってこられます。
この場合はテキストを描画する範囲だけ渡せばいいです。
var setting = sampleText.GetGenerationSettings(new Vector2 (440f, 1000f));
文字の高さを求めるのは TextGenerator
ではできないのでこの記事では省略しますが、
汎用性を求めないなら行数に適当な数字をかけたり足したりしてもそれなりになります。
補遺・ルビ付けたい
上に挙げたlineCount以外にも様々なpropertyがあります。
最近なんとかルビをうまくつけられないか調べたり考えたりしています。
lines
で各行の高さや行頭の文字のインデックスがはいったUILineInfoのリストが得られるcharacters
で各文字の幅などが入ったUICharInfoのリストが得られる
このあたりが使えそうです。
charactersでルビを付けたい文字の位置が分かればそのあたりににTextが置けたらいいんじゃないかなという気がします。私が実装することがあれば次の記事になるかもしれません。