Unityでインディゲームを作る!

Unityでのゲーム制作を目指し、それに関わる話題についてのブログ

Unity TextMeshProのテキストをスクリプトから操作する、変更方法について [ UI text ]

TextMeshProTest_Cover

 2021.2以降、Unity UIでのテキストはTextMeshProに完全に置き換わりつつあるようで、今回はそのテキスト内容をどう変更するかについてです。

 

 TextMeshProはもはやUnityの基本システムであり、標準でパッケージがインストールされています。問題は以前(Legacy Text)の方法ではテキストにアクセスできず、テキスト内容を変更できないということ。

 今回はテキスト変更のみに絞って、簡単に記事を書きたいと思います。

 

※追記

 本記事では、テキスト・コンポーネントTextMeshProUGUIという抽象度の高いタイプとして扱い、そこからテキスト要素にアクセスしていましたが、TMP_Textからでもテキストを変更できるので、その点について内容を追加しました。

 

テキスト・オブジェクトを作成

 まずはヒエラルキーの作成メニューからテキストをシーンに追加します。UI項目からText - TextMeshProを選択します。

TextMeshProTest_CreateMenu

 すると、自動でCanvasEventSystemがシーンに追加され、そこにTextが加わります。

TextMeshProTest_Hierarchy

 (Input Systemを使っている場合、EventSystemの操作設定をInput Systemに変更する必要がありますが、EventSystemコンポーネントのインスペクター上に警告と共に表示されているボタンを押せば済みます)

 

TextMeshProTest_TextInspector

 これで画面上にテキストを表示できるようになりました。実際に画面にテキストが表示されている様子が、本記事のトップ画像のそれです。細かい設定は省きます。

 というわけで、本題はこのTextコンポーネントのテキスト内容を変える方法についてです。

 

using TMPro

TextMEshProText_Script

 まずはusing文にTMProと書きます。これを書かないと、パッケージをインストールしてても、スクリプトからTextMeshProに触れません。ただし、

TMPro.TextMeshProUGUI

という風に書くことも出来ますので、分かりやすい方を選べばいいと思います。

(追記)TMP_Textクラスが用意されているので、こちらの方がより明確ではありますし、SetTextというメソッドもあります。SetTextを使うと、Garbage Collectionが発生しないようなので、こっちの方が推奨されるかもしれません。

TMP_Text_Script

 テキスト内容の一部が固定化されていて、const string変数を何度も使いまわしていくような場合はこちらの方が良いかもしれません。

 

TextMeshProTest_ScriptInspector

 というわけで、TextMeshProのテキスト・コンポーネントのtext変数はTextMeshProUGUI, TMP_Textから変更できます。

 まずはスクリプトの中でSerializeFieldとして、それらのオブジェクトを宣言し、インスペクター上で目標のUIオブジェクトを入力します。

 textTest.textというように.textフィールドに対して文字列を代入すれば、テキストの中身を変えることが出来ます。(追記)TMP_TextではSetTextメソッドを使います。

 

TextMeshProTest_TimerText

 例えば、Time.timeの値を使えば、テキストとして経過時間を表示するというようなことも出来るようになるので、上手く使っていきたいですね!

TMP_Text_StopWatchScript

 こちらはTMP_Text版です。SetTextメソッドがあり、Place Holderで数字を置き換えたりも出来るので、こちらの方がやはり色々と融通が利くと思います。

TMP_Text_StopTimeButton

 ボタンにパブリック関数を登録し、ゲームが起動してからの経過時間をSetText関数を使って表示させる、ということを試してみました。

 

まとめ

 以上、テキスト内容を変える方法はたったこれだけです。TextMeshProに関しては、自分はこれまでほとんど触ってきてはいなかったので、これから自分もきっちり調べていきたいと思います。