その他
    ホーム 技術発信 DoRuby UnityのTextGeneratorについて
    UnityのTextGeneratorについて
     

    UnityのTextGeneratorについて

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

    UnityがuGUIのTextを描画するのに色々キャッシュしておくためのクラス、TextGeneratorを使って色々できます。

    TextGeneratorとは・何に使えるのか

    TextGenerator はTextの描画に使われているらしいです。
    uGUIのソースコードは公開されており、 UI/UnityEngine.UI/UI/Core/Text.cs を読んでみると出てきます。

    ざっくり言うと Populate または PopulateWithError で描画に必要なデータを生成してくれるものです。
    Populate には、描画したい文字列とフォントやフォントサイズ、文字寄せ位置などの設定を入れておく TextGenerationSettings を渡します。

    普通にTextを使っているぶんには直接これを触る必要は全くないのですが、
    文字列がどう描画されるのかを知りたいときに非常にお世話になります。

    Textの高さをどのくらいにするつもりか知りたい

    チャットのような、文章によってオブジェクトの大きさが変わるものでオブジェクトプーリングを行うときにテキストがどのくらいの高さになるのか知りたくて使いました。

    GetPreferredHeight といういかにもよさそうな関数がありますが、これには現在バグがあるようで、思った通りの結果を返してくれません。

    https://issuetracker.unity3d.com/issues/textgenerator-dot-getpreferredwidth-slash-height-ignores-textgenerationsettings

    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が置けたらいいんじゃないかなという気がします。私が実装することがあれば次の記事になるかもしれません。