在使用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) { //按钮点击时响应的操作 }
到这里,大功告成啦!