【Unity】TextMeshProのInputFieldから入力文字列を読み取る

UnityのTextMeshProのInputFieldの値を読み取るには、まずInputFieldの参照を取得し、そのtextプロパティを使用して値を取得します。以下はその基本的な手順です:

手順の概要

  1. TextMeshPro InputFieldの参照を取得する: UnityエディタでInputFieldをシーンに配置し、スクリプトからアクセスできるようにします。これは、ドラッグ&ドロップでインスペクターにInputFieldをアタッチするか、またはスクリプトで直接検索することで実現できます。
  2. 値を読み取る: InputFieldのtextプロパティを使用して現在のテキスト値を読み取ります。

ステップバイステップの例

1. InputFieldをシーンに追加

Unityエディタで、UIコンポーネントとしてTextMeshProのInputFieldを追加します。これを行うには、メニューバーから「GameObject > UI > TextMeshPro – InputField」を選択して、シーンにInputFieldを追加します。

2. スクリプトでInputFieldの参照を取得

InputFieldを操作するためのスクリプトを作成し、そこでInputFieldの参照を保持します。InputFieldをスクリプトに直接アタッチするか、FindObjectOfTypeGetComponentメソッドを使用してプログラムで見つけることができます。

アウトレット接続で取得する方法

using TMPro;
using UnityEngine;

public class InputFieldTest : MonoBehaviour
{
    public TMP_InputField inputField;

    public void OnEnterInputField()
    {
        string inputValue = inputField.text; // InputFieldのテキスト値を取得
        Debug.Log("InputFieldの値: " + inputValue);
    }
}

FindObjectOfTypeで取得する方法

using UnityEngine;
using TMPro; // TextMeshProの名前空間を使用

public class InputFieldReader : MonoBehaviour
{
    public TMP_InputField inputField; // エディタからアタッチするか、スクリプトで設定

    void Start()
    {
        if (inputField == null)
        {
            // InputFieldがアタッチされていない場合、自動的に見つける
            inputField = FindObjectOfType<TMP_InputField>();
        }
    }

    // 値を読み取るメソッド
    public void OnEnterInputField()
    {
        string inputValue = inputField.text; // InputFieldのテキスト値を取得
        Debug.Log("InputFieldの値: " + inputValue);
    }
}

3. 値を読み取る

上記のOnEnterInputFieldメソッドを任意のタイミングで呼び出すことで、InputFieldの現在の値を読み取り、例えばログ出力や他の処理に使用することができます。例えば、入力確定時にこのメソッドを紐付けて、クリック時に値を読み取るようにすることができます。

実行結果

注意点

  • Unityのバージョンによっては、TextMeshProの使用に、TextMeshProパッケージがプロジェクトにインストールされている必要があります。UnityのPackageManagerを使用して、TextMeshProをプロジェクトに追加してください。

おまけ

イベントをコードで実現するには

インスペクターウィンドウで登録するのではなく、コードで完結する方法になります

using TMPro;
using UnityEngine;

public class InputFieldTest : MonoBehaviour
{
    public TMP_InputField inputField;

    void Start()
    {
        inputField.onEndEdit.AddListener(OnEnterInputField);
    }
    public void OnEnterInputField(string inputMsg)
    {
        Debug.Log("InputFieldの値: " + inputMsg);
    }
}

このコードは、UnityでのUI操作におけるテキスト入力フィールド(TMP_InputField)の使用方法を示しています。

  1. using TMPro;using UnityEngine;は、それぞれTextMeshProとUnityエンジンの名前空間をインポートしています。これにより、TextMeshProやUnityのクラスや関数を使うことができます。
  2. InputFieldTestクラスはMonoBehaviourクラスを継承しています。これはUnityのコンポーネントとして振る舞うクラスであり、特定のオブジェクトにアタッチして使用します。
  3. inputFieldという名前の公開されたTMP_InputField型の変数が宣言されています。これはUnityのInspectorパネルで設定できるようになります。
  4. Start()メソッドは、ゲームオブジェクトがアクティブになった直後に実行されるメソッドです。この中で、inputFieldonEndEditイベントにOnEnterInputFieldメソッドを追加するリスナーが設定されています。つまり、ユーザーが入力フィールドで入力を終了したときに、OnEnterInputFieldメソッドが呼び出されるようになります。
  5. OnEnterInputFieldメソッドは、引数として入力されたテキストを受け取り、それをログに表示します。このメソッドはpublicであり、外部から直接呼び出すこともできますが、通常は入力フィールドの終了編集イベントから呼び出されます。

このコードは、ユーザーが入力フィールドに何かを入力して完了すると、その内容をログに表示するシンプルな機能を実装しています。

さらに整理すると

using TMPro;
using UnityEngine;

public class InputFieldTest : MonoBehaviour
{
    [SerializeField] private TMP_InputField inputField;

    private void Start()
    {
        SubscribeToInputFieldEvents();
    }

    private void SubscribeToInputFieldEvents()
    {
        if (inputField != null)
        {
            inputField.onEndEdit.AddListener(OnEnterInputField);
        }
        else
        {
            Debug.LogError("InputFieldが割り当てられていません。");
        }
    }

    private void OnEnterInputField(string inputMsg)
    {
        Debug.Log("InputFieldの値: " + inputMsg);
    }
}

このリファクタリングでは、次の変更が加えられました:

  1. inputField変数を[SerializeField]属性を使ってプライベートに変更しました。これにより、InspectorパネルからアタッチされたTMP_InputFieldを直接設定できます。
  2. SubscribeToInputFieldEvents()メソッドを導入し、Start()メソッドの中でイベントの購読を行うようにしました。これにより、Start()メソッドがより簡潔になり、意図が明確になります。
  3. SubscribeToInputFieldEvents()メソッド内でinputFieldがnullである場合のエラーチェックを追加しました。これにより、inputFieldが割り当てられていない場合に警告を出すことができます。
  4. OnEnterInputField()メソッドをプライベートに変更しました。これにより、外部からの直接呼び出しを制限し、クラス内でのみ使用されるようになります。

これらの変更により、コードがより保守しやすく、拡張性が向上しました。

Unity

Posted by hidepon