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)
        {
           //按鈕點擊時響應的操作
        }

到這里,大功告成啦!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM