はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】InputFieldで入力の編集が終わったときにメソッドを呼ぶ(onEndEdit)

はじめに

今回はInputFieldで入力の編集が終わったときにメソッドを呼ぶ方法についての記事になります!

実際のイメージはこんな感じ。

f:id:hanaaaaaachiru:20200107131827g:plain

早速みていきましょう。

方法1「インスペクターから設定する」

一番簡単な方法はインスペクターから設定することでしょう。

まずは適当なInputFieldのゲームオブジェクトを作成し、インスペクターを見てみてください。

f:id:hanaaaaaachiru:20200107132851p:plain

このOn End Editという箇所にメソッドを登録することで入力の編集後にメソッドを実行することができます

f:id:hanaaaaaachiru:20200107134330g:plain

今回用いたスクリプトは以下の通りで、任意のゲームオブジェクトにアタッチをすることで選択することができるようになります。

using UnityEngine;
using UnityEngine.UI;

public class InputFieldTest : MonoBehaviour
{
    [SerializeField] private InputField _inputField;
    [SerializeField] private Text _text;

    public void UpdateText()
    {
        _text.text = _inputField.text;
    }
}

f:id:hanaaaaaachiru:20200107134620p:plain

メソッドのアクセス修飾子はpublicでないとインスペクターから参照できない事に注意してください。

またOn End Editの上にあるOn Value Changedは、値が変化した時にメソッドが毎回呼ばれるものになります。

方法2「スクリプトから設定する」

次はスクリプトから設定する方法についてみてみましょう。

こちらの場合は、onEndEditというプロパティについて詳しくみていく必要があるかもしれません。

public UI.InputField.SubmitEvent onEndEdit{ get; set; }


onEndEditの型であるSubmitEventってなんやねんとなるかもしれませんが、InputField用のUnityEventの事です。

内部的にもUnityEventクラスを継承しています。

いわゆる.NETSystem.ActionのUnityバージョンのことで、大きな違いはインスペクターから設定できるかどうかです。

細かいところはこちらの記事が参考になると思います。
【Unity】UnityEventの用法と用量 - うら干物書き


ここらへんの知識から、以下のコードを作ってみました。

using UnityEngine;
using UnityEngine.UI;

public class InputFieldTest : MonoBehaviour
{
    [SerializeField] private InputField _inputField;
    [SerializeField] private Text _text;

    private void Start()
    {
        // onEndEditイベントにUpdateTextメソッドを登録する
        _inputField.onEndEdit.AddListener(UpdateText);
    }

    private void UpdateText(string text)
    {
        // テキストを更新する
        _text.text = text;
    }
}

AddListener,RemoveListenerあたりはUnityイベントの独特なところなので、覚えておくと良いでしょう。

これを任意のゲームオブジェクトにアタッチし、テキストフィールドとテキストのゲームオブジェクトの参照を設定すれば動くはずです。

さいごに

インスペクターからの設定はとてもお手軽で便利ですが、気付いたら設定が消えていたり、見直したら意味がわからなくなってしまったりといった事もあります。

どちらにもメリットデメリットがあると思うので、うまく使い分けていけたらいいのではないかと思います。

ではまた。