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