ボタンのクリックイベントを意識せず監視できないかと思って 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)); } } }