【Unity】TextMeshProのInputFieldから入力文字列を読み取る
UnityのTextMeshProのInputFieldの値を読み取るには、まずInputFieldの参照を取得し、そのtext
プロパティを使用して値を取得します。以下はその基本的な手順です:
手順の概要
- TextMeshPro InputFieldの参照を取得する: UnityエディタでInputFieldをシーンに配置し、スクリプトからアクセスできるようにします。これは、ドラッグ&ドロップでインスペクターにInputFieldをアタッチするか、またはスクリプトで直接検索することで実現できます。
- 値を読み取る: InputFieldの
text
プロパティを使用して現在のテキスト値を読み取ります。
ステップバイステップの例
1. InputFieldをシーンに追加
Unityエディタで、UIコンポーネントとしてTextMeshProのInputFieldを追加します。これを行うには、メニューバーから「GameObject > UI > TextMeshPro – InputField」を選択して、シーンにInputFieldを追加します。
2. スクリプトでInputFieldの参照を取得
InputFieldを操作するためのスクリプトを作成し、そこでInputFieldの参照を保持します。InputFieldをスクリプトに直接アタッチするか、FindObjectOfType
やGetComponent
メソッドを使用してプログラムで見つけることができます。
アウトレット接続で取得する方法
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)の使用方法を示しています。
using TMPro;
とusing UnityEngine;
は、それぞれTextMeshProとUnityエンジンの名前空間をインポートしています。これにより、TextMeshProやUnityのクラスや関数を使うことができます。InputFieldTest
クラスはMonoBehaviour
クラスを継承しています。これはUnityのコンポーネントとして振る舞うクラスであり、特定のオブジェクトにアタッチして使用します。inputField
という名前の公開されたTMP_InputField
型の変数が宣言されています。これはUnityのInspectorパネルで設定できるようになります。Start()
メソッドは、ゲームオブジェクトがアクティブになった直後に実行されるメソッドです。この中で、inputField
のonEndEdit
イベントにOnEnterInputField
メソッドを追加するリスナーが設定されています。つまり、ユーザーが入力フィールドで入力を終了したときに、OnEnterInputField
メソッドが呼び出されるようになります。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);
}
}
このリファクタリングでは、次の変更が加えられました:
inputField
変数を[SerializeField]
属性を使ってプライベートに変更しました。これにより、InspectorパネルからアタッチされたTMP_InputField
を直接設定できます。SubscribeToInputFieldEvents()
メソッドを導入し、Start()
メソッドの中でイベントの購読を行うようにしました。これにより、Start()
メソッドがより簡潔になり、意図が明確になります。SubscribeToInputFieldEvents()
メソッド内でinputField
がnullである場合のエラーチェックを追加しました。これにより、inputField
が割り当てられていない場合に警告を出すことができます。OnEnterInputField()
メソッドをプライベートに変更しました。これにより、外部からの直接呼び出しを制限し、クラス内でのみ使用されるようになります。
これらの変更により、コードがより保守しやすく、拡張性が向上しました。
ディスカッション
コメント一覧
まだ、コメントがありません