Unity入門

【Unity】TextMeshProUGUIで文字変更・改行・寄せ方向・AutoSizeをスクリプトで制御する

この記事について

この記事ではTextMeshProUGUIでの文字変更や改行等をスクリプトで制御する方法が学べます。

この記事で分かること

UnityのTextMeshProUGUIはスクリプトから柔軟に操作可能です。

  • .textで文字列を更新
  • \nやEnvironment.NewLineで改行を挿入
  • .fontSizeでサイズ変更
  • .alignmentで寄せ方向を制御
  • .enableAutoSizingでAutoSizeを有効化

TextMeshProUGUIとは?

TextMeshProUGUIについては以下の記事を参考にしてください。

文字変更・改行・寄せ方向・AutoSize

TextMeshProUGUIの準備

まずはヒエラルキーで右クリックをしてTextMeshProUGUIを1つ用意します。
・「右クリック」→「UI」→「Text – TextMeshPro」

次にスクリプトを作成して先ほどのTextMeshProUGIにアタッチしてください。

using TMPro;
using UnityEngine;

public class TextMeshProSample : MonoBehaviour
{
    [SerializeField] private TextMeshProUGUI tmpUGUI;
   
    void Start()
    {
        // 同じGameObjectにアタッチされているTextMeshProを取得
        tmpUGUI = GetComponent<TextMeshProUGUI>();
    }
}


ここまで出来たら準備完了です!

テキストを動的に変更する

シンプルですが最も多用します!
私のゲームでも、プレイヤーがアイテムを取った瞬間に即座に数値が変わるようにしました。今回はスタート時にテキストが変わるようにしています。

using TMPro;
using UnityEngine;

public class TextMeshProSample : MonoBehaviour
{
    [SerializeField] private TextMeshProUGUI tmpUGUI;
   
    void Start()
    {
        // 同じGameObjectにアタッチされているTextMeshProを取得
        tmpUGUI = GetComponent<TextMeshProUGUI>();
        
        //テキストを動的に変更
        tmpUGUI.text = "Score:100";
    }
}


実行するとこのようにスタート時に切り替わります。

改行を正しく扱う

TextMeshProUGUIは「\n」を使えば改行できます。先ほどのスクリプトを以下のように書き換えてみましょう!
※環境依存せずに改行したい場合は「System.Environment.NewLine」を利用します。

tmpUGUI.text = "Score\n100";
//tmpUGUI.text = "Score" + System.Environment.NewLine + "100";


実行したらこのようになります。
このやり方はスコア表示やボタンのテキストに使われていることが多いイメージです。

フォントサイズを変更する

次にフォントサイズの変更を行っていきます。
フォントサイズは「.fontSize」で操作することが可能です!

using TMPro;
using UnityEngine;

public class TextMeshProSample : MonoBehaviour
{
    [SerializeField] private TextMeshProUGUI tmpUGUI;
   
    void Start()
    {
        // 同じGameObjectにアタッチされているTextMeshProを取得
        tmpUGUI = GetComponent<TextMeshProUGUI>();
        
        //テキストを動的に変更
        tmpUGUI.text = "Score\n100";
        //tmpUGUI.text = "Score" + System.Environment.NewLine + "100";

        //フォントサイズの変更
        tmpUGUI.fontSize = 60.0f;
    }
}


実行するとこんな感じになります。
フォントサイズの変更は演出で強調したい場面に便利です。

文字の寄せ方向を制御する

次に文字の寄せ方向を制御する方法を説明していきたいと思います。
寄せ方向は「.alignment」で操作することが可能です!

tmpUGUI.alignment = TextAlignmentOptions.Left;    // 左寄せ
tmpUGUI.alignment = TextAlignmentOptions.Center;  // 中央寄せ
tmpUGUI.alignment = TextAlignmentOptions.Right;   // 右寄せ


それぞれの寄せ方向のイメージ画像が以下のようになります!

AutoSizeの使い方

次にAutoSizeをスクリプトで制御する方法を説明していきたいと思います。
以下のようなスクリプトを使えばテキストの自動サイズ調整がされますが、処理が重たいという情報があるため、使用にはご注意ください。

tmpText.enableAutoSizing = true;
tmpText.fontSizeMin = 18f;
tmpText.fontSizeMax = 60f;

TextMeshProUGUIで簡易タイマー表示の実装

ここではタイマーの実装例を載せておきます。
※今回は説明のためにテキストのフォントサイズや寄せ方向を動的にしてますが、事前に設定できるものはしておいたり、プレハブ化しておく方が効率はいいかと思います。

using TMPro;
using UnityEngine;

public class TextMeshProSample : MonoBehaviour
{
    [SerializeField] private TextMeshProUGUI tmpUGUI;
    private float timer = 5.0f;

    void Start()
    {
        // 同じGameObjectにアタッチされているTextMeshProを取得
        tmpUGUI = GetComponent<TextMeshProUGUI>();
        
        //テキストを動的に変更
        tmpUGUI.text = "Time\n0";

        //フォントサイズの変更
        tmpUGUI.fontSize = 60.0f;

        // 中央寄せ
        tmpUGUI.alignment = TextAlignmentOptions.Center;  
    }

    void Update()
    {
        timer -= Time.deltaTime;
        timer = Mathf.Max(timer, 0); // 0未満にならないよう制御

        tmpUGUI.text = "Time\n" + Mathf.CeilToInt(timer);

        //タイマーが0になったらスクリプトを削除する。
        if (timer <= 0)
        {
            tmpUGUI.text = "Time\n0";
            Destroy(this);
        }
    }
}


それでは最後に挙動をみて終わりにします。
タイマーが0で止まること、アタッチしているスクリプトが削除されていたら成功です!

まとめ

  • .textで文字を更新 → スコアやメッセージ表示に必須
  • \nやEnvironment.NewLineで改行を制御 → セリフやUIを見やすく調整
  • .fontSizeで強調表示可能 → 演出に便利
  • .alignmentで寄せ方向を制御 → スコアやチャットUIに最適
  • .enableAutoSizingでAutoSizeを有効化 → 長文対策に有効だが、使いすぎ注意