Unity

TextMeshProについてのメモ

TMP_Textを理解するのに重要っぽいフィールド

・TMP_Textでは入力された文字列を「private TextBackingContainer m_TextBackingArray」(TextBackingContainer・・・文字配列をラップしたTMPのinternalな構造体)に保持している。
・また、リッチテキストタグの除去など、加工を行った後の文字列を「internal UnicodeChar[] m_TextProcessingArray」(UnicodeChar・・・TMPのinternalな構造体)に保持している。
・加工後の文字列から生成した描画用の情報は「TMP_TextInfo m_textInfo」(TMP_TextInfo・・・文字、頂点、色などの描画情報を保持するpublicなclass)に保持され、これをいじると描画に手を加えることができる(グラデーション、移動回転拡縮等々)。

文字列設定後の処理の流れ

①TMP_Text.textにstringを設定した場合

TMP_Text.textプロパティからstringを設定すると、「private string m_text」にそのまま代入される。

PopulateTextBackingArray(string sourceText)が呼ばれるとm_text -> m_TextBackingArrayに反映され、PopulateTextProcessingArray()が呼ばれるとm_TextBackingArray -> m_TextProcessingArrayに反映される。

m_TextProcessingArrayからメッシュ生成まではTMP_Textの子クラス(TextMeshPro,TextMeshProUGUI)で行われる。

GenerateTextMesh()でm_TextProcessingArray -> m_textInfoに反映される。

※m_textに代入された後の処理は、基本的にレンダリング直前(Canvas.willRenderCanvased)まで待って実行される(必要に応じて(GetPreferredValues()やForceMeshUpdate())それより前に呼ばれることもあるっぽい)。

②TMP_Text.SetText(string sourceText, bool syncTextInputBox = true)から設定した場合

PopulateTextBackingArray(string sourceText),m_textに設定,PopulateTextProcessingArray()が即時呼ばれる。
その後①と同じようにメッシュが生成される。

③TMP_Text.SetText(string sourceText, float arg0, …)

1文字ずつm_TextBackingArrayにコピーされ、{n}が見つかると適宜argに置換される。

エディタ上ではm_TextBackingArray -> m_textに反映される(エディタ表示のため)。この時、新たにstringが生成され、アロケーションが発生してしまうが、ビルド時は解消される。

④TMP_Text.SetTextのChar[]やStringBuilderを引数に取るやつ

③と同じ感じ

TMP_Text使用上の注意点

アロケーション対策にSetCharArray(char[] sourceText )、数字に表示にSetText(string sourceText, float arg,…)などが有用(文字列結合による新規string生成のアロケーションを回避して動的なテキストを表示できる)だが、TMP_Text.textプロパティを使うと、内部的には文字の配列で取りまわしているものをstring型で返すために新たにstringが生成されてしまう。

コメント

タイトルとURLをコピーしました