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