一、为什么不使用匿名方法,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等其他监听也都一样可以通过这种方法来使用