KENTEM TechBlog

建設業のDXを実現するKENTEMの技術ブログです。

【Unity】クリック時に特定のメソッドを実行する方法集めてみた

Unityの学習を進めていくにつれて、ボタンをクリックした際に特定の処理を実行するためには、いろいろな方法があることを学びました。

本記事では、それらの方法のうち5つを紹介します。

AddListenerで登録する

Buttonコンポーネントを取得し、AddListenerメソッドで引数に指定されたメソッドを実行する方法です。

この書き方は新人研修で学んで以来よく使ってきたため、個人的には馴染みがある書き方です。

using UnityEngine;
using UnityEngine.UI;

public class SampleButtonScript : MonoBehaviour
{
    private Button _button;

    private void Start()
    {
        _button = GetComponent<Button>();
        _button.onClick.AddListener(OnClick);
    }

    private void OnDestroy() => _button.onClick.RemoveListener(OnClick);

    public void OnClick()
    {
        Debug.Log("Hello World");
    }
}

インスペクターから指定する

実はインスペクターから特定のメソッドを呼び出すこともできます。

Buttonコンポーネントの下部をよく見るとOnClick()と書いてあるところがあります。

  1. None (Object)と書いてあるところをクリックし、動かしたい処理がアタッチされているGameObjectを選択します。
  2. No Function と書いてあるところをクリックし、メソッド名を選択します。
  3. 下記のような表示になります。 この場合、上記のようにAddListenerやRemoveListenerは不要になり、下記だけでOnClickメソッドを呼び出すことができるようになります。
using UnityEngine;

public class SampleButtonScript : MonoBehaviour
{
    public void OnClick()
    {
        Debug.Log("Hello World");
    }
}

IPointerClickHandlerを実装するような書き方にする

UnityEngine.EventSystems.IPointerClickHandlerを用いる方法もあります。

これを実装するように指定しておくとOnPointerClickメソッドが必須となり、その中にクリック時の処理を記述できます。

ButtonやToggleなどのComponentがアタッチされていないものの、クリックしたときに何らかの処理が必要な場合には便利です。

また、引数のPointerEventDataを用いることで、右クリックか左クリックかなど詳細な情報を取得できます。

docs.unity3d.com

using UnityEngine;
using UnityEngine.EventSystems;

public class SampleButtonScript : MonoBehaviour, IPointerClickHandler
{
    public void OnPointerClick(PointerEventData eventData)
    {
        switch (eventData.button)
        {
            case PointerEventData.InputButton.Left:
                Debug.Log("左クリック");
                break;
            case PointerEventData.InputButton.Right:
                Debug.Log("右クリック");
                break;
        }
    }
}

Event Triggerを用いる

Event Triggerコンポーネントでクリック時に実行する処理を登録することができます。

  1. Event Triggerコンポーネントをアタッチします。ボタンをクリックし、PointerClickを選択します。
  2. 先述の「インスペクターから指定する」方法と同じものを指定すればOnClickメソッドが実行されます。

こちらもButtonコンポーネントをアタッチしていない場合には便利です。

Buttonクラスをオーバーライドする

1つ目の「AddListenerで登録する」で紹介した方法の亜種ですが、Buttonクラスをオーバーライドすることでもクリック時の処理を実装できます。 標準のButtonクラスから派生したボタンであることを明示したい場合にはこのような書き方をすることができます。

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class SampleButtonScript : Button
{
    public override void OnPointerClick(PointerEventData eventData)
    {
        base.OnPointerClick(eventData);
        Debug.Log("Hello World");
    }
}

おわりに

KENTEMでは、様々な拠点でエンジニアを大募集しています! 建設×ITにご興味頂いた方は、是非下記のリンクからご応募ください。 recruit.kentem.jp career.kentem.jp