うにてぃブログ

UnityやUnreal Engineの記事を書いていきます

【Unity】ボタンのクリックイベントを監視する

ボタンのクリックイベントを意識せず監視できないかと思って static なクラスを使って監視する処理を書いてみました

サンプル

Button.SetEvent で指定した Key を ButtonEvent.Listen で登録しているメソッドに対して実行します

ButtonEvent.Remove を呼び出すと指定した Key で登録しているイベントがすべて削除されます

using ButtonExtension;
using UnityEngine;
using UnityEngine.UI;

public class SampleMonoBehaviour : MonoBehaviour
{
    [SerializeField]
    private Button _buttonTest;
 
    private void Awake()
    {
        _buttonTest.SetEvent("Click");
    }
 
    private void OnDestroy()
    {
        ButtonEvent.Remove("Click");
    }
}
 
public class SampleMonoBehaviour : MonoBehaviour
{
    private void Awake()
    {
        ButtonEvent.Listen("Click", ClickButtonTest);
    }
 
    private void ClickButtonTest()
    {
    }
}

コード

using System;
using System.Collections.Generic;
using UnityEngine.UI;
 
namespace ButtonExtension
{
    public static class ButtonEvent
    {
        private static readonly Dictionary<string, Action> _buttonAction = new Dictionary<string, Action>();

        public static void Listen(string key, Action action)
        {
            if (_buttonAction.TryGetValue(key, out var a))
            {
                a += action;
                _buttonAction[key] = a;

                return;
            }

            _buttonAction.Add(key, action);
        }
 
        public static void Remove(params string[] keys)
        {
            foreach (var key in keys)
            {
                if (_buttonAction.ContainsKey(key))
                {
                    _buttonAction.Remove(key);
                }
            }
        }
 
        internal static void Broadcast(string key)
        {
            if (_buttonAction.TryGetValue(key, out var a))
                a.Invoke();
        }
 
        public static void Clear()
        {
            _buttonAction.Clear();
        }
    }
 
    public static class ButtonEventExtension
    {
        public static void SetEvent(this Button self, string key)
        {
            self.onClick.AddListener(() => ButtonEvent.Broadcast(key));
        }
    }
}