在使用unity制作UI的過程中,基本都需要接觸到按鈕,然后按鈕要起作用的話,那么就需要為按鈕綁定響應方法。
為按鈕綁定觸發的方法,我知道的有兩種方法,第一種:手動使用unityEditor 綁定,另一種就是使用代碼動態綁定。
這里記錄一下代碼動態綁定的具體實現過程:
思路:首先通過按鈕的節點、名字在代碼中返回對應的按鈕對象,然后在點擊按鈕的時候,就給一個統一的委托賦值,
然后用委托去調用對應的響應方法。
做法步驟:
1. 新建一個類,用於聲明委托,並且給每一個按鈕附加上這個類。
using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
public class EventTriggerListener : MonoBehaviour, IPointerClickHandler, IPointerDownHandler
{
//聲明委托
public delegate void VoidDelegate(GameObject go);
public VoidDelegate onClick;
public VoidDelegate onDown;
static public EventTriggerListener Get(GameObject go)
{
EventTriggerListener listener = go.GetComponent<EventTriggerListener>();
if (listener == null) listener = go.AddComponent<EventTriggerListener>();
return listener;
}
//實現IPointerClickHandler接口的方法,在這里調用委托。
public void OnPointerClick(PointerEventData eventData)
{
if (onClick != null) onClick(gameObject);
}
//實現IPointerDownHandler接口的方法,在這里調用委托。
public void OnPointerDown(PointerEventData eventData)
{
if (onDown != null) onDown(gameObject);
}
2. 再建一個類,這個類主要功能是以名字來查找對應按鈕,並且將其綁定到委托上,代碼如下:
using UnityEngine; using System.Collections; public class BJL_UIBehaviour : MonoBehaviour { // Use this for initialization private GameObject _rootNode = null; public GameObject RootUI { get { return _rootNode; } set { _rootNode = value; } } //根據傳入name找到RootUI下的gameobject public GameObject QueryUINodes(string name) { if (RootUI!=null) { var child = RootUI.gameObject.transform.FindChild(name); if (child!=null) { return child.gameObject; } } return null; } //用傳入的name屬性去找物體,找到后將其賦值給node,並且返回一個bool值。 //說明賦值是否為空。 public bool BindProperty(string name, out GameObject node) { node = QueryUINodes(name); return node !=null; } //用傳入的name屬性去找到一個gameobject,同時將其綁定到go物體上,如果綁定 //成功,那么就獲取go物體上的EventTriggerListener腳本,並且將傳入的委托del //賦值給委托 onClick public bool BindObjectClick(string name, EventTriggerListener.VoidDelegate del) { GameObject go = null; //如果綁定成功 if (BindProperty(name,out go)) { EventTriggerListener.Get(go).onClick = del; return true; } return false; }
3. 最后,需要做的就是編寫具體按鈕的點擊響應方法,然后調用BJL_UIBehaviour 中的BindObjectClick(string name ,EventTriggerListener.VoidDelegate del)方法來動態綁定。
using UnityEngine; using System.Collections; using UnityEngine.UI; using System.Collections.Generic; public enum ClipType { Clip100 = 1, } public class BJL_BetClip : BJL_UIBehaviour { public static int ChouMaType ; private ClipType _select_type = ClipType.ClipUnknow; private GameObject _last_obj = null; public ClipType SelectType { get { return _select_type; } } void Awake() { GameObject root = this.gameObject.transform.FindChild("DownUI/Chips").gameObject; RootUI = root; BindObjectClick("Chip100", onClip100Click); } void onClip100Click(GameObject go) { //按鈕點擊時響應的操作 }
到這里,大功告成啦!