匿名関数で追加したボタンのイベント通知を削除する

※この記事は2017年06月17日にqiitaに投稿した内容です。

環境

Unity5.6.1f1

概要

ボタンのonClickに登録した匿名関数をRemoveAllListeners()で全削除するのではなく、個別に削除します 匿名関数でなくても使えるし、OnClick以外のイベントにも使えます

プログラム

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Events;

public class TestUnityEvent : MonoBehaviour
{
    [SerializeField] private Button[] _buttons = null;
    private struct EventParam
    {
        public UnityAction action;
        public UnityEvent unityEvent;
    }
    private List<EventParam> _eventParams = new List<EventParam>();

    private void OnEnable()
    {
        for( int i = 0; i < _buttons.Length; i++ )
        {
            var button = _buttons [ i ];
            var index = i;

            var param = new EventParam()
            {
                unityEvent = button.onClick
            };
            button.onClick.AddListener( param.action = () => OnButtonClick( button, index ) );
            _eventParams.Add( param );
        }
    }

    private void OnDisable()
    {
        for( int i = 0; i < _eventParams.Count; i++ )
        {
            var param = _eventParams[ i ];
            param.unityEvent.RemoveListener( param.action );
        }
        _eventParams.Clear();
    }

    private void OnButtonClick( Button button, int index )
    {
        Debug.Log( button.name + ":" + index );
    }
}