Unity入門

【Unity】Buttonのクリック処理(onClick)をスクリプトで登録・解除する方法

この記事について

この記事ではButtonのクリックイベント(OnClick)をAddListener、RemoveListenerで登録・解除する挙動をスクリプトで制御する方法が学べます。

この記事でわかること

  • AddListenerで1つ以上のメソッドを登録することは可能
  • 引数付き処理を呼びたい場合は ラムダ式 を使う
  • 不要になった処理は RemoveListener や RemoveAllListeners で解除できる

Button – TextMeshProとは?

Buttonについては以下の記事を参考にしてください。

Buttonのイベント登録・解除

Buttonとスクリプトの準備

まずはヒエラルキーで「Button-TextMeshPro」と「スクリプト」を生成し、スクリプトをButtonにアタッチして下さい。

ButtonをAddListenerでメソッドを登録する

ButtonにはOnClickイベントというものがあり、インスペクターでの設定もできますが、今回はスクリプトでのイベント登録を行っていきます。
また、イベントの登録は「.AddListener」で登録ができ、1つ以上のイベントの登録が可能です。

using TMPro;
using UnityEngine;

public class Button_AddListener : MonoBehaviour
{
    [SerializeField] private UnityEngine.UI.Button testButton;
    [SerializeField] private TextMeshProUGUI testText;

    void Start()
    {
        // 同じGameObjectにアタッチされているButtonを取得
        testButton = GetComponent<UnityEngine.UI.Button>();

        // Buttonの子オブジェクトにアタッチされているTextMeshProを取得
        testText = testButton.GetComponentInChildren<TextMeshProUGUI>();

        // ボタンに処理を追加
        testButton.onClick.AddListener(OnButtonClicked);
    }
    //クリック処理
    private void OnButtonClicked()
    {
        testText.text ="Click!!!";
    }
}

実行するとインスペクターのスクリプトにButtonとTextMeshProUGUIがアタッチされ、Buttonをクリックするとテキストが「Click!!!」になるかと思います。


TextMeshProについては以下のサイトを参考にしてください。

AddListenerで引数付きメソッドを呼びたい場合

AddListenerにそのまま引数付きメソッドを渡すことはできません。そのような時にラムダ式を使えば引数付きメソッドを渡すことが可能になります。

using TMPro;
using UnityEngine;

public class Button_AddListener : MonoBehaviour
{
    [SerializeField] private UnityEngine.UI.Button testButton;
    [SerializeField] private TextMeshProUGUI testText;

    void Start()
    {
        // 同じGameObjectにアタッチされているButtonを取得
        testButton = GetComponent<UnityEngine.UI.Button>();

        // Buttonの子オブジェクトにアタッチされているTextMeshProを取得
        testText = testButton.GetComponentInChildren<TextMeshProUGUI>();

        // ボタンの処理に引数を渡す
        testButton.onClick.AddListener(() => OnButtonClick("Click"));
    }

    //引数付きクリック処理
    private void OnButtonClick(string str)
    {
        testText.text = str;
    }
}


実行するとOnButtonClickが引数として「Click」という文字列を受け取りテキストに反映します。

ButtonのOnClickでクリック処理を解除する方法

動的に追加したAddListenerは、状況に応じて外すことも可能です。
解除方法は「.RemoveListener」、「.RemoveAllListeners」を使用しましょう。
これを使う場面としてはUIの再利用時に「前の処理が残って二重実行される」バグを防げます。
※私はあまり使用しないので今回は書き方だけ残しておきます。

void OnDisable()
{
    // 特定のメソッドだけ外す
    testText.onClick.RemoveListener(OnButtonClicked);

    // 全部まとめて外す
    // testText.onClick.RemoveAllListeners();
}

Buttonを使ってカウントアップを作成

今回は最小構成でボタンを使用したカウントアップを作成していきます。前項まではメソッド化してましたがラムダ式を使用して以下のスクリプトのように実装も可能です。

using TMPro;
using UnityEngine;

public class Button_AddListener : MonoBehaviour
{
    [SerializeField] private UnityEngine.UI.Button testButton;
    [SerializeField] private TextMeshProUGUI testText;

    void Start()
    {
        // 同じGameObjectにアタッチされているButtonを取得
        testButton = GetComponent<UnityEngine.UI.Button>();

        // Buttonの子オブジェクトにアタッチされているTextMeshProを取得
        testText = testButton.GetComponentInChildren<TextMeshProUGUI>();
        testText.text = "0";

        // ボタンの処理に引数を渡す
        testButton.onClick.AddListener(() => CountUp(1));
    }

    //カウントアップ
    private void CountUp(int value)
    {
        testText.text = (int.Parse(testText.text) + value).ToString();
    }
}


実行するとカウントアップができるかと思われます。
補足として「int.Parse」は文字列をint型に変換し、「.ToString()」は数値を文字列に変換します。

まとめ

  • .AddListenerでクリック処理を追加できる
  • ラムダ式で複数処理の登録や引数付き呼び出しも可能
  • 不要になったらRemoveListenerRemoveAllListenersで解除する