topaz-dev’s

ああああああ

TextMeshProで行数を取得する

テキストメッシュプロを用いてテキストを入力した時に行数を取得して動的にフレームなどの大きさを変えたい時のメモ

public class TMPTest : MonoBehaviour
{
    [SerializeField] TextMeshProUGUI _textField;
    private void SetSize()
    {
        var textInfo = _textField.GetTextInfo(_textField.text);
        // 指定したテキストを入れた時に何行に改行されるかを取得する。
        lineCount = textInfo.lineCount;

        RectTransform rect = this.GetComponent<RectTransform>();
        // ここで行数を用いて大きさを指定する。
        int height = 100;
        rect.sizeDelta = new Vector2(rect.sizeDelta.x, height);
    }
}

基本的にはこれで取得できるのだが、テキストメッシュプロをStart関数でテキストの内容を変えてそのフレームでGetTextInfoを呼び出すとエラーが出てしまった。具体的には以下の実装である。原因はよくわからなかったが恐らく内部でなんらかの初期化が行われていないのだと感じた。

void Start(){
    _textFiled.text = "hoge";
    // ↓なぜか Null のエラーが出てしまった。。。
    var textInfo = _textField.GetTextInfo(_textField.text);
}

これを回避するために、コルーチンを用いて1フレームあとに取得してみた。

void Start(){
    _textFiled.text = "hoge";
    StartCoroutine(GetTextInfo());
}
IEnumerator GetTextInfo()
{
    // 1フレーム飛ばす。
    yield return null;
    // テキストインフォを取得する
    var textInfo = _textField.GetTextInfo(_textField.text);
}

1フレーム待ってからGetTextInfoを呼び出すと先ほど出ていたNullポのエラーが出ずに取得することが出来た。
一時的な回避策ではあるがこれで問題なく動いた。

まとめ

TextMeshProの行数を取得することが出来た。
原因不明のヌルポのエラーを一時的な回避策で乗り越えたがエラー原因はわからなかった。