TextMesh ProとuGUIで文字レイアウトを取得する


概要

文字をCanvas上とかに出すじゃない。

そんなとき、

「この文字列はこのフィールド上でどんな感じに改行されるの?」

とかを事前に知りたくなるじゃない。なるよね?


それぞれこんな感じで取得できる。



uGUI

// Text textComponent みたいなものに対して

// TextGenerator generator = new TextGenerator(); みたいなのをグローバルで取得しておいて使い回すことができる


var text = "なんか特定の広さの領域に表示してどう改行されるか知りたい文字列";


// 使い回すならinvalidateで過去の情報を消す必要がある

generator.Invalidate();


// コンポーネントにテキストをセットする。

textComponent.text = text;


var setting = textComponent.GetGenerationSettings(new Vector2(viewWidth, float.PositiveInfinity));

generator.Populate(text, setting);



var lineCount = generator.lineCount;

var lines = generator.lines;// 各行の情報、行の高さとかspacingの高さが取れる


太字の行の処理でgeneratorにレイアウト情報が入る。

レイアウトするサイズ情報をいくらでも好きなように設定、レイアウトを試すことができる。


取得できる情報は、全体の行数と各行の情報。大元の文字列のどこからどこまでがこの行、とかのインデックスも入っている。



TextMesh Pro

// TMProのコンポーネント TMPro.TextMeshProUGUI textComponentというのがあったとして


var text = "なんか特定の広さの領域に表示してどう改行されるか知りたい文字列";


textComponent.text = text;


// textComponentに対してwidthをセットする必要がある。高さは無限設定でOK

textComponent.rectTransform.sizeDelta = new Vector2(viewWidth, float.PositiveInfinity);


// このメソッドは、コンポーネントがgameobjectにアタッチされて、かつgameobjectがcanvasに乗っている場合のみ動作する。

var textInfos = textComponent.GetTextInfo(text);


// 各行の要素とパラメータを取得する。

var tmGeneratorLines = textInfos.lineInfo;

var lineSpacing = textComponent.lineSpacing;

var tmLineCount = textInfos.lineCount;


太字の行の処理でgeneratorにレイアウト情報が入る。

まず TMPro.TextMeshProUGUIコンポーネント のrectTransformを弄る。こうすることで描画されるサイズが変わる。

uGUIとは異なりcanvas上に配置されたgameobjectにTMPro.TextMeshProUGUIコンポーネントがアタッチされている前提でないと動作しない。


取得できる情報はuGUIと大差ない。