最近做一个UI面板,里面需要好几个按钮,有按钮就要添加点击事件,按我之前都是哪个按钮需要添加事件,就在这个按钮下面挂个脚本,里面写上button点击之后所出发的方法,然后直接挂载在button下面,如下图所示:

这样就可以了;但是这样做的扩展性很差,会比较凌乱,尤其是多人合作的时候,你可能让别人在需要这个按钮的点击事件的时候再去看你写的代码,并在里面进行操作,一个很好的解决方法就是C#中委托事件机制,可以直接在外部进行注册事件,这样,你只需要把事件定义好,等到别人想要用这个点击事件的时候,他也只需要重新注册一下你的事件,换成他的方法就行了,具体的操作是:

1、在你的按钮上添加一个脚本:

 

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class ButtonEvents : MonoBehaviour
{

  public delegate void ButtonDelegate();
  public event ButtonDelegate ClickButton;

  void Start()
  {
    GameObject btObj = GameObject.Find(name);
    Button bt1 = btObj.GetComponent<Button>();
    bt1.onClick.AddListener(delegate () { this.ButtonClick(btObj); });
  }

  public void ButtonClick(GameObject go)
  {
    if (ClickButton != null)

      ClickButton();
  }
}

这样在按钮上面就不用再去拖脚本了,Start方法里面已经进行了点击事件的监听,只要点击了按钮就会监听到ClickButton事件;

2、接下来要做的只是在需要使用这个事件的时候进行注册就行了

using UnityEngine;
using System.Collections;
using System;

public class RegisterEvent : MonoBehaviour
{


  void Start()
  {
    //事件的注册
    GameObject.Find("Button1").GetComponent<ButtonEvents>().ClickButton += Print1;
    GameObject.Find("Button2").GetComponent<ButtonEvents>().ClickButton += Print2;
    GameObject.Find("Button3").GetComponent<ButtonEvents>().ClickButton += Print3;

  }

  void Print1()
  {
    Debug.Log("111");
  }
    void Print2()
  {
    Debug.Log("222");
  }
    void Print3()
  {
    Debug.Log("333");
  }
}

这个脚本可以挂在任何物体上,它的之行结果是,当鼠标点击到命名为Button1 的按钮时就调用Print1方法,控制台就会输出111;同理,当鼠标点击到Button2和Button3的时候分别会调用Print2和Print3方法