【Unity】TextMeshProとは?ゲーム内にテキストを表示できる

Unity

こんにちは、ともくんのゲーム作り部屋にようこそ!

このページでは、

「TextMeshProがどういうものなのか知りたい。」

「Unityでテキストを表示させたいけど、どうしたらいいの?」

というお悩みの方に向けた内容となっています。

Unityでテキストを表示する際に、TextMeshProというコンポーネントを使用します。

このTextMeshProとは、Unity内にUIやゲーム内でのセリフなどといったテキストを表示するのに使われます。

また、TextMeshProを使うことで、テキストのフォントやサイズ、表示のされ方などを細かく指定して表示させることができます。

そこで、このページでは、TextMeshProコンポーネントについて、どんな仕様や特徴があるのか、また使い方や設定項目についてまとめていきます。

この記事を書いた人

ゲーム作りを学び始めた一児のパパです。
このブログは、子供から「ゲームを作ってみたい!」と言われ、非プログラマーでゲーム作りをしたことない僕が、ゲーム作りの本を読んで独学でゲーム開発を学んでいるブログです。
同じように初めてゲーム作りをしている方と一緒に学んでいけるようなブログに出来たらいいなと思っています。
また、「このコードはおかしい」とか「もっと良い書き方があるよ!」などあれば、どんどん指摘して頂けると助かります。

TextMeshProコンポーネントとは?

まずは、TextMeshProコンポーネントを使って、どういうことができるのかを紹介していきます。

テキストを表示するためのコンポーネント

TextMeshProコンポーネントは、冒頭でも解説した通りでテキストを表示させることができるコンポーネントです。

例えば、UI表示としてゲーム内でのスコア時間メニュー内のテキストなどにTextMeshProを使うことで、そのテキストを表示させることができます。

また、他にもゲーム内でのキャラクターのセリフであったり、物語のストーリーなどでテキストが使われます。

これらのようなテキストを表示する処理の際に、TextMeshProコンポーネントが使えます。

Textよりも質の高いテキストを表示できる

Unityには、テキストを表示できるものとしてTextMeshPro以外にも、「Text」というものがありますが、TextMeshProの方がより質の高いテキストを表示させることができます。

このTextは、Unityの中で古くから搭載されている機能になっていて、TextMeshProと同じようにUnityでテキストを表示できます。

ただ、古い機能ということもあって設定できる項目が少なく、TextMeshProの方がより細かいテキスト加工を行うことができ、ゲーム内での表示も滲まずに綺麗に表示させることができます。

そのため、現在ではUnity内でテキストを表示させるのは、TextMeshProを使う方法がほとんどです。

ただし、Textの場合は日本語表示を簡単に行うことができるというメリットがあります。

TextMeshProとTextMeshProUGUIの2タイプがある

TextMeshProコンポーネントには、

の2つのコンポーネントがあります。

「TextMeshPro」の方は、3D型のテキストでゲームオブジェクトとして使うことができるテキストで、UIではなくテキストとしてゲーム内に表示させる場合に使用します。

このTextMeshProは、MeshRendererと連携してテキスト表示させているという特徴があります。

一方で、「TextMeshProUGUI」の方は、UIとして主に2Dのテキストを表示させる際に使用します。

このTextMeshProUGUIは、CanvasRendererとUIを表示させる領域を作るCanvasと連携してテキストを表示させており、親オブジェクトにCanvasコンポーネントを持つオブジェクトを配置する必要があります。

TextMeshProの使い方

ここからは、TextMeshProの使い方や設定項目などについてまとめていきます。

ヒエラルキーウィンドウから追加する

TextMeshProを使う際は、ヒエラルキーウィンドウから追加していきます。

3DテキストであるTextMeshProを追加する場合は、ヒエラルキーウィンドウの+ボタンから「3D Object」「Text – TextMeshPro」を選択することで、Text (TMP)という名前のオブジェクトが配置されます。

このText (TMP)には、

  • Rect Transform
  • Mesh Renderer
  • TextMeshPro – Text
  • Text Mesh Pro Mesh

のコンポーネントが紐づいています。

また、UI用に表示する「TextMeshProUGUI」を追加する場合は、ヒエラルキーウィンドウの+ボタンから「UI」「Text – TextMeshPro」を選択すると、Canvasという親オブジェクトの中に、Text (TMP)のオブジェクトが作られます。

このText (TMP)には、

  • Rect Transform
  • Canvas Renderer
  • TextMeshPro – Text(UI)

のコンポーネントが紐づいています。

TextMeshProコンポーネントの主な設定項目

ここからは、TextMeshProコンポーネントの設定項目について、

の3つに分けて主な設定項目を紹介していきます。

Text Input:入力するテキストに関する項目

Text

この欄に入力したテキストが、TextMeshProによって実際にゲーム内に表示されます。

そのままテキストを入力するだけでなく、リッチテキストタグを設定して入力することもできます。

Enable RTL Editor

通常、入力したテキストは左から右に表示されますが、Enable RTL Editorにチェックを入れると右から左に表示されます。

Text Style

スタイルシートで設定したスタイルを適用して表示することができます。

スタイルシートはデフォルトで設定されていますが、独自で作成することもできます。

Main Settings:表示するテキストの設定項目

Font Asset

テキストのフォントを設定する項目です。

デフォルトでは、2つのフォントを選ぶことができますが、独自でフォントをダウンロードしてインポートしてくることで、好みのフォントを使用することができます。

なお、TextMeshProで日本語を扱う場合は、日本語に対応したフォントを設定する必要があります。

Material Preset

どのマテリアルを使用するかを設定する項目です。

TextMeshProでは、マテリアルを使用することで、テキストに様々なエフェクトを付けることができます。

なお、初めからデフォルトのマテリアルが自動で作成されています。

Font Style

テキストを表示するスタイルを設定することができます。

以下の7項目をテキストに反映させることができます。

B太字
Iイタリック(斜体)
U下線
S取り消し線
ab全てを小文字にする
AB全てを大文字にする
SC小文字を大文字にする(文字の大きさはそのまま)
Font Size

テキストを表示するサイズを変更できます。

デフォルトのフォントサイズは「36」になっています。

Auto Size

テキストの表示サイズを、領域に合わせて自動で決めてくれる設定です。

テキストの表示領域は、シーンビューの黄色の枠の部分になっていて、Auto Sizeにチェックを入れると、この範囲に収まるサイズに自動で設定することができます。

Auto Sizeのオプションとして、以下の項目を設定することができます。

Minフォントサイズの最小値
Maxフォントサイズの最大値
WD%横幅のサイズを縮小させてテキストを縦長にする
Line複数行のテキストの行間の間隔を変更する
Vertex Color

テキストの頂点カラーをカラーピッカーから選択します。

Color Gradient

テキストにカラーグラデーションを付けることができます。

チェックを入れると以下の項目が表示されて、様々なグラデーションの設定を行うことができます。

Color Presetグラデーションをあらかじめ設定したプリセットを使用する。
Color Modeどのようにグラデーションを設定するかを以下の4つから選択する。

①Single:グラデーションをかけず単色でテキストを表示する。
②Horizontal Gradient横方向(左から右)に2色でグラデーションをかける。
③Vertical Gradient縦方向(上から下)に2色でグラデーションをかける。
④Four Corners Gradient4つの角に色を設定してグラデーションをかける。
ColorsColor Modeに合わせて設定するカラーを指定する
Override Tags

リッチテキストタグで指定したカラー設定を無効にする項目です。

Override Tagsにチェックを入れると、<color>のタグで指定したカラー設定を無効にして、Vertex Colorなどで設定した色で表示されます。

Spacing Options

文字の間隔を設定する項目で、以下の4つの値を設定できます。

Character文字同士の間隔を設定する
Wordスペースの広さを設定する
Line行の間隔を設定する(改行と自動改行のどちらも含む)
Paragraph改行における行の間隔を設定する(自動改行は含まない)
Alignment

テキストの配置方法に関する設定を行います。

Leftテキストを左揃えで表示する。
Centerテキストを左右中央揃えで表示する。
Rightテキストを右揃えで表示する。
Justifiedテキストを両端揃えで文字間隔を均等に配置して表示する。
表示領域よりも文字数の少ない行は左揃えで表示される。
Flushテキストを両端揃えで文字間隔を均等に配置して表示する。
表示領域よりも文字数の少ない行も両端揃えで表示される。
Geometry Center実際の文字の形状に合わせて、左右中央揃えで表示する。
Centerにしても文字によって真ん中に表示されない場合におすすめ。
Topテキストを上揃えで表示する。
Middleテキストを上下中央揃えで表示する。
Bottomテキストを下揃えで表示する。
Baselineテキストが配置されている基準のベースラインを真ん中にして表示する。
Midline実際の文字の形状に合わせて、上下中央揃えで表示する。
Capline大文字の上を揃えているキャピタルラインとベースラインの真ん中を中央揃えで表示する。

また、「Justified」「Flush」を選択した場合は、「Wrap Mix (W <-> C)」という項目が表示されます。

これは、単語と単語をスペースで区切った際の間隔を調整できる項目になっています。

Text Wrapping Mode

テキストが、横幅の表示領域を超えた際に、自動改行させるかどうか、また改行の際の空白の扱いを決めている項目です。

No Wrap自動改行せずに、表示領域を超えてテキストが表示される。
手動での改行の際の空白は消える。
Normal自動改行されてテキストが折り返して表示される。
改行の際の空白は消える。
Preserve Whitespace自動改行されてテキストが折り返して表示される。
改行の際の空白はそのまま表示される。
Preserve Whitespace No Wrap自動改行されずに、表示領域を超えてテキストが表示される。
手動での改行の際の空白はそのまま表示される。
Overflow

テキストが横幅の表示領域を超えても、「Text Wrapping Mode」の設定で自動改行されない場合の処理内容を選択できます。

Overflowテキストが表示領域を超えてもそのまま表示させる。
Ellipsisテキストが表示領域に入らない分は表示されない代わりに「…」で省略される。
Truncateテキストが表示領域に入らない部分は、表示されず消える。
Pageテキストを複数のページに分けて、どのページを表示するかを決める。
Linkedテキストの表示領域に入らない部分を別のTextMeshProオブジェクトに表示させる。
Horizontal Mapping

テキストにテクスチャを付ける際に、横方向に対してどのように設定するかを決める項目です。

Character1文字ごとにテクスチャを付けて表示する
Line1行ごとにテクスチャを付けて表示する
Paragraph表示領域の横幅に合わせてテクスチャを付けて表示する
Match Aspect1文字ごとにテクスチャを付けて表示する。
ただしテクスチャのアスペクト比が維持される。
Vertical Mapping

テキストにテクスチャを付ける際に、縦方向に対してどのように設定するかを決める項目です。

設定項目は、Horizontal Mappingと同じく、

  • Character
  • Line
  • Paragraph
  • Match Aspect

の4つから選択することができます。

Extra Settings:詳細な設定項目

Margins

テキストの表示領域に対して、余白を設定することができる項目です。

Left(左)・Top(上)・Right(右)・Bottom(下)のそれぞれおける余白を設定できます。

Geometry Sorting

テキストとテキストが重なっているときに、どのテキストを上に表示するかを制御している項目です。

Normal後ろに入力されているテキストがに表示される
Reverse後ろに入力されているテキストがに表示される
Rich Text

リッチテキストタグによる処理を行うかどうかを設定できます。

Raycast Target

オブジェクトに対して、レイキャストによる当たり判定を行うかどうかを決めることができます。

簡単に言えば、UIとしてテキストを表示した際に、クリックなどで判定させるかどうかを決めています。

Parse Escape Characters

エスケープシーケンスによる入力を認識するかどうかを決めている項目です。

例えば、この項目にチェックが入っている場合、

  • \n」 ⇒ 改行
  • \t」 ⇒ タブ

として、認識させることができます。

Sprite Asset

テキストにスプライト画像を表示する際のアセットを設定することができます。

Style Sheet Asset

テキストに利用したいスタイルシートのアセットを設定することができます。

スクリプトからテキスト内容を設定する

ここまでのTextMeshProの設定は、スクリプトからでも変更することができます。

例えば、表示させたいテキストの内容をスクリプトから変更する場合は、テキストのオブジェクトにスクリプトをアタッチして、

  • TextMeshProコンポーネントを取得する
  • Textに設定したいテキストを代入する

という手順で行うことができます。

TextMeshProコンポーネントを取得する

TextMeshProコンポーネントを取得する場合は、GetComponentメソッドを使って取得しておきます。

using UnityEngine;
using TMPro;    // TextMeshProを扱う際に記述が必要

public class Test : MonoBehaviour
{
    TextMeshProUGUI sampleText;

    void Start()
    {
        sampleText = GetComponent<TextMeshProUGUI>();   // TextMeshProUGUIを取得する
    }
}

10行目でGetComponentを使う際、

  • 3D型のテキスト「TextMeshPro」
  • UI用のテキスト「TextMeshProUGUI」

それぞれ<>の部分に上記の内容を入れてあげることで、コンポーネントを取得できます。

ここでは、UIのTextMeshProを使用しているので、TextMeshProUGUIで記述しています。

また、TextMeshProをスクリプトから扱う場合は、2行目のようにスクリプトの最初の部分で、

using TMPro;

と、書いてあげる必要があります。

Textに設定したいテキストを代入する

TextMeshProコンポーネントを取得できたら、表示するテキストを設定するTextの項目に入力したい値を代入していきます。

今回は、スペースキーを押すと「tomokun games」という文字に変更するようにしてみます。

using UnityEngine;
using TMPro;    // TextMeshProを扱う際に記述が必要

public class Test : MonoBehaviour
{
    TextMeshProUGUI sampleText;
    string changeText = "tomokun games";    // 変更したいテキストの変数

    void Start()
    {
        sampleText = GetComponent<TextMeshProUGUI>();   // TextMeshProUGUIを取得する
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))    // スペースキーを押した場合
        {
            sampleText.text = changeText;   // text変数に代入
        }
    }
}

Textの項目に入るデータは、文字列であるstring型になるので、7行目でstring型の変数を宣言しています。

そして、if文内の18行目でtext変数の値に代入して、テキストの内容を変更します。

これで、実際にゲームを実行してスペースキーを押してみると、

テキストの内容を変更することができました。

なお、スコアや時間などのようにTextに数値を入れる場合、int型float型のままではデータ型が異なるため、代入することができません。

そのため、代入する前にstring型に変更することができるToStringメソッドで処理を行ってから、代入する必要があります。

using UnityEngine;
using TMPro;    // TextMeshProを扱う際に記述が必要

public class Test : MonoBehaviour
{
    TextMeshProUGUI sampleText;
    int score = 10; // 変更したい数値

    void Start()
    {
        sampleText = GetComponent<TextMeshProUGUI>();   // TextMeshProUGUIを取得する
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))    // スペースキーを押した場合
        {
            sampleText.text = score.ToString();   // 文字列型に変更してtext変数に代入
        }
    }
}

これでゲーム実行してスペースキーを押すと、

数値をテキストオブジェクトに表示させることができました。

まとめ

このページでは、Unityで使うことができるTextMeshProコンポーネントについて、どんなことができるのか、特徴や使い方をまとめていきましたが、いかがでしたでしょうか?

TextMeshProコンポーネントは、Unity内でテキストを表示することができるコンポーネントで、

の2種類があります。

同じようにテキスト表示できる古い機能でTextコンポーネントもありますが、TextMeshProの方が滲まず質の高いテキストを表示することができます。

ただ、TextMeshProをスクリプトから扱う際は、スクリプトの最初に

using TMPro;

と、記述しておく必要があるので忘れずに確認しておきましょう。

最後までお読みいただきまして、ありがとうございました!

コメント