在开发的过程当中给按钮添加事件是非常常见的工作,但是往往会出现即想统一在一个脚本中对一个模块的按奶进行管理,又不想给按钮挂载脚本的情况。换句话来说在给按钮添加了事件之后,在执行回调时我们无法得到具体是哪一个按钮被点击了,那么如果我们要针对按钮对象有一些操作,比如被点击的按钮进行缩放时,我们就要针对每一个按钮都写一个回调方法。但是这样就显得很麻烦,总觉得代码会很冗余。那么此时就可以用到我下面写到的代码来实现。
/// <summary>
/// Button类扩展
/// </summary>
public static class Extension_Btn
{
/// <summary>
/// 添加事件
/// </summary>
/// <param name="btn">传入按钮</param>
/// <param name="action">普通事件</param>
/// <param name="btnAction">绑定按钮事件</param>
public static void AddEvent(this Button btn, UnityAction action, UnityAction<Button> btnAction)
{
action += () => { btnAction(btn); };
btn.onClick.AddListener(action);
}
/// <summary>
/// 添加事件
/// </summary>
/// <param name="btn">传入按钮</param>
/// <param name="btnAction">绑定按钮事件</param>
public static void AddEvent(this Button btn, UnityAction<Button> btnAction)
{
UnityAction action = () => { btnAction(btn); };
btn.onClick.AddListener(action);
}
/// <summary>
/// 添加事件
/// </summary>
/// <param name="btn">传入按钮</param>
/// <param name="action">普通事件</param>
public static void AddEvent(this Button btn, UnityAction action)
{
btn.onClick.AddListener(action);
}
}
这段代码中需要注意类和扩展方法都需要是静态的static修饰,括号里传入的参数this Button btn表示针对Button类按钮进行扩展,btn既是调用这个扩展方法的按钮对象。
下面是扩展方法的调用
public class Test02 : MonoBehaviour
{
public Button button;
public Button button1;
public Button button2;
private void Start()
{
button.AddEvent(OnClickNormal);
button1.AddEvent(OnClickNormal, OnClickBtn);
button2.AddEvent(OnClickBtn);
button.AddEvent(OnClickBtn);
Button3.AddEvent(OnClickBtn);
Button4.AddEvent(OnClickBtn);
Button5.AddEvent(OnClickBtn);
Button6.AddEvent(OnClickBtn);
}
void OnClickNormal()
{
Debug.Log("normal");
}
void OnClickBtn(Button btn)
{
Debug.Log(btn.name);
}
}
在这里就可以统一对按钮进行管理,也不愁因为无法获取到点击的按钮而写多个方法造成代码冗余。