Unity 如何在循环中给Button注册监听,不使用匿名方法,Lambda表达式也能获取到Button自身

一、为什么不使用匿名方法,Lambda表达式?

如果使用匿名方法,Lambda表达式,就会导致难以注销监听,只能使用RemoveAllListeners方法注销全部,有时候这不是我所期望的

二、具体代码

1.引入库

代码如下:

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

public class Test : MonoBehaviour
{
    /// <summary>
    /// 假设有一个Button数组
    /// </summary>
    public List<Button> ToggleGroup = new List<Button>();
    /// <summary>
    /// 保存按钮的监听,用于在其他地方移除监听
    /// </summary>
    Dictionary<Button, UnityAction> map = new Dictionary<Button, UnityAction>();

    private void OnEnable()
    {
        // 注册监听
        foreach (Button button in ToggleGroup)
        {
        	// 此处使用内部方法,可以获取到button这个局部变量
            void function()
            {
                // 在这里可以获使用button
                Debug.Log($"{button.name}");
            }
            button.onClick.AddListener(function);
            map[button] = function;
        }
    }

    private void OnDisable()
    {
        //移除监听,也可以在任何其他地方通过map来获取,移除监听
        foreach (Button button in ToggleGroup)
        {
            button.onClick.RemoveListener(map[button]);
        }
    }
}

三、总结

此处使用Button仅为示例,Toggle等其他监听也都一样可以通过这种方法来使用

猜你喜欢

转载自blog.csdn.net/qq_40080418/article/details/125573088