【Unity】どのボタンオブジェクトからイベントが発生したか調べる

WindowsFormsアプリの場合、引数にイベントを起動したオブジェクトとパラメータを渡されますが、Untiyの基本のイベントでは知ることができません

いくつかの方法がありますのでみていきましょう

イベントが発生した時の呼び出されるメソッド(イベントハンドラと呼ばれます)で取得する場合

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

public class EventTest : MonoBehaviour
{
    public void TaskOnClick()
    {
        Button clickedButton = EventSystem.current.currentSelectedGameObject.GetComponent<Button>();
        Debug.Log($"{clickedButton}がクリックされた");
    }
}

イベント発生させたオブジェクトを静的に渡す場合

UnityEventのインスタンスを作成し、イベントを発生したオブジェクトを引数として渡す方法

using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;

public class EventTest : MonoBehaviour
{
    public Button button;
    public UnityEvent<GameObject> onClickEvent = new UnityEvent<GameObject>();

    private void Start()
    {
        onClickEvent.AddListener(TaskOnClick);
        button.onClick.AddListener(() => onClickEvent.Invoke(button.gameObject));
    }

    public void TaskOnClick(GameObject sender)
    {
        Debug.Log($"{sender}がクリックされた");
    }
}

イベント発生させたオブジェクトを静的に渡す場合

UnityEventを継承したクラスのインスタンスを作成し、イベントを発生したオブジェクトを引数として渡す方法

using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;

public class EventTest : MonoBehaviour
{
    public Button button;
    public ButtonClickEvent onClickEvent = new ButtonClickEvent();

    private void Start()
    {
        onClickEvent.AddListener(TaskOnClick);
        button.onClick.AddListener(() => onClickEvent.Invoke(button.gameObject));
    }

    public void TaskOnClick(GameObject sender)
    {
        Debug.Log($"{sender}がクリックされた");
    }
}

public class ButtonClickEvent : UnityEvent<GameObject>
{
}

インスペクターで動的にイベントを発生したオブジェクトを引数として渡す方法

登録手順動画

using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;

public class EventTest : MonoBehaviour
{
    public Button button;
    public UnityEvent<GameObject> onClickEvent = new UnityEvent<GameObject>();

    private void Start()
    {
        button.onClick.AddListener(() => onClickEvent.Invoke(button.gameObject));
    }

    public void TaskOnClick(GameObject sender)
    {
        Debug.Log($"{sender}がクリックされた");
    }
}

ボタンが2つの場合

using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;

public class EventTest : MonoBehaviour
{
    public Button button1;
    public Button button2;
    public UnityEvent<GameObject> onClickEvent = new UnityEvent<GameObject>();

    private void Start()
    {
        button1.onClick.AddListener(() => onClickEvent.Invoke(button1.gameObject));
        button2.onClick.AddListener(() => onClickEvent.Invoke(button2.gameObject));
    }
    public void TaskOnClick(GameObject sender)
    {
        Debug.Log($"{sender}がクリックされた");
    }
}

ボタンオブジェクトにスクリプトをアタッチして汎用性のある引数ありのイベントを作成する

Buttonオブジェクトにアタッチするスクリプト

using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;

public class ButtonClickSampleEvent : MonoBehaviour
{
    public UnityEvent<GameObject> onClickEvent = new UnityEvent<GameObject>();

    private void Start()
    {
        GetComponent<Button>().onClick.AddListener(() => onClickEvent.Invoke(gameObject));
    }
}

イベントハンドラが登録されているオブジェクトにアタッチするスクリプト

どのオブジェクトにアタッチされていても構いません

using UnityEngine;

public class Receiver : MonoBehaviour
{
    public void TaskOnClick(GameObject sender)
    {
        Debug.Log($"{sender}がクリックされた");
    }
}

登録手順動画

Unity,イベント

Posted by hidepon