【Unity】初心者でもわかる!スクリプトからテキストの文字を変える方法

はじめに


 UIやスコア、残りの数やコンボ数など…内容が変わるテキストはどのゲームでもあると思います。しかしUnityの機能だけでは実装が難しそうです。
 そこで今回はスクリプト(プログラム)でテキストを変える方法について紹介します。


使用した環境とバージョン


 今回はUnity ver.2021,3.4f1を使用しています。
 また、プログラムを書く時にはVisual Studio 2022を使用しました。

達成目標


 スクリプトを使ったテキストの変更と、変数を使った文章を表示できるようにします。

 では早速やっていきましょう。

準備


(出来ている方は飛ばしちゃって大丈夫です)

  1. 本記事はUnityを使用したものです。入ってない場合は入れましょう。

  2. プログラムを書きます。書ける環境でやりましょう。

  3. 表示したい言語のフォントをダウンロードしておきましょう。

  4. ダウンロードしたらUnity用に変換して設定しましょう。
    まずはダウンロードしたフォントのotfファイルやttfファイルをUnityに入れます。(今回はロゴたいぷゴシックをお借りしました。)

名前がアルファベットじゃなかったら変えておきましょう
英語表記にしました

 Assetsフォルダーに入れましょう。わかりやすくファイル分けしておくといいですね。

Assetsフォルダ内のfontフォルダにフォントが入ってます

 次にWindowsタブからTextMeshPro→Font Asset Creatorを選択します。

上のTextと間違えないように!

開いたウィンドウの一番上の Source Font File に先ほど入れたフォントをドラッグ&ドロップします。

 そうしたら、Character Set の右の選択肢を選択して Custom Characters を選択します。

下のほうにあるよ

 選択後、その下に出現した Custom Character List に表示する文字を全て書きます。

日本語のテキストはGithubGistに提供してくださっている方がいるので、そちらをお借りしましょう。
サイトに飛んだ後、ページ右側の「Download ZIP」を押すとダウンロードできます。

ダウンロードしたら中のテキストの内容をコピーして、UnityにもどってCustom Character Listにペーストしましょう。
(もしエラーが出る場合は使わない漢字や記号の部分を消してしまいましょう)

ひらがなカタカナ常用漢字記号だけ

その下の Generate Font Atlas を押すと変換が始まります。

Save as... を押すとUnity用に変換されたフォントを保存することができます。

元のフォントの上にUnity用に変換されたフォントが追加されました

これでフォントの設定は完了です。

手順


①Text-TextMeshProの作成

 Hierarchy の下の + を押して UI からText-TextMeshProを選択します。

作成したら好きなところに設置します。

ど真ん中に置いてみました

設置したら Font Asset に入れたフォントをドラッグ&ドロップします。

入れたら日本語を打っても□にならない!
しっかり表示されてます


これで作成は完了です!

②スクリプトの作成1 キーで内容が変わるプログラム

 次はプログラムです。
 この記事では「キーを押すと内容が変わるもの」と「変数を使って内容が変わるもの」を作っていきます。
 
今回は「数字キーを押すと、どのボタンが押されたか表示される」というものを作っていきます。
 まずHierarchyの+からCreateEmptyを選択します。(スクリプトをアタッチするためのオブジェクトです。これを作らずテキストにスクリプトを作成しても大丈夫です)

作成したオブジェクトのInspectorの一番下にあるAdd ConponentからNew scriptを作成します。

名前はTextKeyにしました

作成したスクリプトを開いて以下のように書いてください。


using TMPro;

public class TextKey : MonoBehaviour
{
    [SerializeField] TextMeshProUGUI KeyText;

    void Update()
    {
        if (Input.GetKey(KeyCode.Alpha1))
        {
            Key_Text.text = "1が押された";
        }
    }
}


簡単な解説

まず上のusing群にTMProを入れましょう。
これでTextMeshProのシステムが簡単にいじれるようになります。

using TMPro;

TextKeyのところは作成したスクリプトの名前を書いてください。

public class TextKey : MonoBehaviour

usingの下のSerializeFieldでTextMeshProを読み込みます。
publicだと他から変えられちゃうのでSerializeFieldがいいと思います。

[SerializeField] TextMeshProUGUI KeyText;

Update内のif文は、キーボードの1(Alpha1)が押されたら 上でとってきたテキスト(KeyText)のTextを「1が押された」に変更するというプログラムです。

if (Input.GetKey(KeyCode.Alpha1))
     {
      KeyText.text = "1が押された";
     }

これを保存してUnityに戻ります。

先ほど作成したスクリプトの下にTextMeshProを入れる枠ができているので、①で作成したTextMeshProをドラッグ&ドロップします。

KeyTextという枠ができている

これで実行してみましょう。

1を押すと文章が変わりました

1を押すとしっかり動作していることがわかりますね。
それではもう一度スクリプトに戻りましょう。

先ほどのif文の後ろに以下の文章を追加してみましょう。

if (Input.GetKey(KeyCode.Alpha2))
{
KeyText.text = "2が押された";
}

上の1を2に変えたバージョンです。

保存してUnityに戻ってみましょう。
特に変化はないですね。
このまま実行してみましょう。

これで1を押すと「1が押された」、2を押すと「2が押された」が表示されるようになりました。
キーを押すと内容が変わるプログラムはこれで完了です。

③スクリプトの作成2 変数を使った内容が変わるプログラム

次は変数を使ったものです。
今回は「キーを押すと押した回数が表示される」というものを作ります。

先ほどと同じようにスクリプトを作成しましょう。

名前はTextVarにしました

作成したスクリプトを開いて、以下の以下のように書いてください。

using TMPro;

public class TextVar : MonoBehaviour
{
    [SerializeField] TextMeshProUGUI VarText;
    int NowTimes = 0;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Alpha3))
        {
            NowTimes++;

            string Times = NowTimes.ToString();

            VarText.text = "3を押した回数:" + Times + "回";
        }
    }
}

簡単な解説
TMProやSerializeFieldは②で説明した感じと

NowTimesは今何回押されているかを記録するための変数です。
この後のifの中にNowTimes++;(NowTimesに1づつ追加する)というように出てきます。

 int NowTimes = 0;

Update内のif分に書いてあるキーの判定が、今回はGetKeyDownになってます。GetKeyだと押しっぱなしでとんでもない数増えちゃうので、今回はDown(押したとき、キーが沈んだ時)に判定が起こるようにしてます。

if (Input.GetKeyDown(KeyCode.Alpha3))

Timesをstring(文字列型)で作成して、NowTimesをString型に変えて代入しています。
これはVarTextのtextに入れるために文字型にしないといけないからです。
変数は、文字を入れる" "の前または後に+をつけて書きます
挟む場合も+で区切ることで変数を使うことができます。

string Times = NowTimes.ToString();

VarText.text = "3を押した回数:" + Times + "回";

これを保存してUnityに戻りましょう。

先ほど作成したスクリプトの下にTextMeshProを入れる枠ができているので、例にならってTextMeshProをドラッグ&ドロップします。

これで実行してみましょう。

3を押すと押した分だけ数字が増えていくのがわかりますね。

変数を使った内容が変わるプログラムはこれで完了です。

結果


1や2を押すと押されたボタンを表示し、3を押すと押した回数が表示されるようになりました!

途中で1や2を押しても変数はしっかり動いてるね


今回作ったスクリプトはこんな感じです

一つ目

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;

public class TextKey : MonoBehaviour
{
    //TextMeshProを読み込む
    [SerializeField] TextMeshProUGUI KeyText;

    void Update()
    {
        //1を押した場合
        if (Input.GetKey(KeyCode.Alpha1))
        {
            Key_Text.text = "1が押された";
        }

        //2を押した場合
        if (Input.GetKey(KeyCode.Alpha2))
        {
            KeyText.text = "2が押された";
        }
    }
}

二つ目

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;

public class TextVar : MonoBehaviour
{
  //TextMeshProを読み込む
    [SerializeField] TextMeshProUGUI VarText;

    //回数
    int NowTimes = 0;

    void Update()
    {
    //3を押した場合
        if (Input.GetKeyDown(KeyCode.Alpha3))
        {
            NowTimes++;

            string Times = NowTimes.ToString();

            VarText.text = "3を押した回数:" + Times + "回";
        }
    }
}


まとめ


 今回は「キーを押すとテキストの内容が変わるスクリプト」と「変数を使ったテキストの内容が変わるスクリプト」をUnityで作りました。
「[SerializeField] TextMeshProUGUI 変数名 」と「変数名.text = "文章"」の二つを駆使することで、簡単にスクリプトからテキストを変更することができましたね。

テキストをスクリプトから操作するだけで ある程度ゲームのクオリティが上がって見えますので、ぜひ活用してみてくださいね!

参考



この記事が気に入ったらサポートをしてみませんか?