【TextMeshPro】文字が入力されたらイベントを実行する

WindowsフォームアプリでTextBoxに当たるInputFieldの値が更新されたらイベントが実行されるプログラムを考えてみましょう

実行結果

文字を入力すると、コンソールウィンドウに入力されている文字が表示されます
(日本語はキャラクタセットしていません)

シーン構成

ヒエラルキーウィンドウでマウスを右クリック、InputField(TMP)を追加します

スクリプトを2つ追加します

コード

TMPInputEvent

イベントを登録させるスクリプトになります

using TMPro;
using UnityEngine;
using UnityEngine.Events;

public class TMPInputEvent : MonoBehaviour
{
    public UnityAction<string> OnChangeEvent;

    void Start()
    {
        GetComponent<TMP_InputField>().onValueChanged.AddListener(OnChangeEvent);
    }
}

このコードは、TMP_InputFieldコンポーネントのonValueChangedイベントを検出し、それをUnityAction<string>型のOnChangeEventイベントに転送するクラス「TMPInputEvent」を定義しています。

TMP_InputFieldは、TextMeshPro(TMPro)パッケージの一部であり、UnityのUIシステムを拡張して、高度なテキストレンダリング機能を提供するものです。

Start()メソッドは、TMP_InputFieldコンポーネントを取得し、onValueChangedイベントにOnChangeEventを追加することで、入力フィールドの値が変更されたときに呼び出されるリスナーを登録しています。

つまり、このクラスを使用すると、入力フィールドの値が変更されたときに、外部スクリプトでOnChangeEventイベントを受信し、必要なアクションを実行することができます。

TMPInputFieldEventHandler

入力文字が変更された場合に実行したいメソッド(イベントハンドラ)を記述します
このスクリプトは他のゲームオブジェクトにアタッチすることもできます

using UnityEngine;

public class TMPInputFieldEventHandler : MonoBehaviour
{
    void Start()
    {
        GetComponent<TMPInputEvent>().OnChangeEvent = ShowInputData;
    }

    public void ShowInputData(string value)
    {
        Debug.Log(value);
    }
}

このコードは、Unityのゲームオブジェクトにアタッチされたスクリプトで、TMPInputEventというクラスのOnChangeEventイベントをハンドリングしています。具体的には、Start()メソッド内で、GetComponent<TMPInputEvent>()を使ってTMPInputEventコンポーネントを取得し、そのOnChangeEventにShowInputDataメソッドを割り当てています。

ShowInputDataメソッドは、string型の引数を受け取り、その値をDebug.Log()メソッドを使ってデバッグコンソールに出力するだけの単純なものです。

つまり、このスクリプトは、TMPInputEventが発火するたびにShowInputDataメソッドが呼び出され、ユーザーが入力したデータがデバッグコンソールに表示されるようになっています。具体的には、TMPInputFieldEventHandlerスクリプトがアタッチされたゲームオブジェクトが、TMPInputEventをトリガーするUI要素(例えば、TMPのInput Field)である場合が多いです。