【Unity】UIのボタンを押すと他のゲームオブジェクトにアタッチされているスクリプトのメソッドを呼び出す。引数として押したボタンの情報を渡したい

設定手順

以下の手順で設定します。

  1. ターゲットオブジェクトのスクリプト
    • 呼び出されるメソッドを持つスクリプトをターゲットオブジェクトにアタッチします。
using UnityEngine;
using UnityEngine.UI;

public class TargetScript : MonoBehaviour
{
    public void ReceiveButtonInfo(Button button)
    {
        // ボタンの情報を処理
        Debug.Log("ボタンが押されました: " + button.name);
    }
}
  1. UnityEventを設定するスクリプト
    • UnityEventを直接使用し、インスペクターから設定できるようにします。
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;

public class ButtonClickHandler : MonoBehaviour
{
    public Button button;
    public UnityEvent<Button> onClick;

    void Start()
    {
        if (button != null && onClick != null)
        {
            button.onClick.AddListener(() => onClick.Invoke(button));
        }
    }
}
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;

public class ButtonClickHandler : MonoBehaviour
{
    public Button button;
    public UnityEvent<Button> onClick;

    void Start()
    {
        if (button != null && onClick != null)
        {
            button.onClick.AddListener(OnButtonClick);
        }
    }

    void OnButtonClick()
    {
        onClick.Invoke(button);
    }
}
  1. Unityエディタでの設定
    • ButtonClickHandlerスクリプトをUIボタンにアタッチします。
    • ターゲットオブジェクトにTargetScriptスクリプトがアタッチされていることを確認します。
    • ButtonClickHandlerスクリプトのOnClickイベントにTargetScriptReceiveButtonInfoメソッドを追加します。

手順

  1. ButtonClickHandlerスクリプトのonClickイベントのリストに新しいイベントを追加
    • ButtonClickHandlerコンポーネントのインスペクターでOnClickイベントのリストを展開し、「+」ボタンをクリックして新しいイベントを追加します。
  2. 新しいイベントのオブジェクトフィールドにターゲットオブジェクトをドラッグ
    • イベントのオブジェクトフィールドにターゲットオブジェクト(TargetScriptがアタッチされているオブジェクト)をドラッグします。
  3. ドロップダウンメニューからTargetScriptReceiveButtonInfoメソッドを選択
    • イベントのドロップダウンメニューからTargetScriptReceiveButtonInfoメソッドを選択します。
  4. ボタンの情報を引数として設定
    • 引数フィールドにボタン自体を設定します。これはインスペクターで行います。

これで、ボタンが押されると、TargetScriptReceiveButtonInfoメソッドが呼び出され、ボタンの情報が引数として渡されます。ButtonClickedEventクラスを省略して、直接UnityEvent<Button>を使用することで、コードが簡潔になります。

参考

インスペクターでイベントハンドラを登録せず、GameObject.Findでアサインする方法

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

public class ButtonClickHandler : MonoBehaviour
{
    public Button button;
    public string targetObjectName = "TargetObject"; // ターゲットオブジェクトの名前
    public UnityEvent<Button> onClick;

    void Start()
    {
        // ターゲットスクリプトを直接見つける
        TargetScript targetScript = GameObject.Find(targetObjectName).GetComponent<TargetScript>();

        // UnityEventにターゲットスクリプトのメソッドを追加
        onClick.AddListener(targetScript.ReceiveButtonInfo);

        // ボタンのクリックイベントにUnityEventを追加
        button.onClick.AddListener(() => onClick.Invoke(button));
    }
}

Unity

Posted by hidepon