Unity动态绑定按钮触发方法

在使用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)
        {
           //按钮点击时响应的操作
        }

到这里,大功告成啦!

posted @ 2017-03-25 10:33  gameDesigner  阅读(3055)  评论(0编辑  收藏  举报