最近做一个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方法