zoukankan      html  css  js  c++  java
  • 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)
            {
               //按钮点击时响应的操作
            }

    到这里,大功告成啦!

  • 相关阅读:
    【RF库Built-In测试】Catenate
    SpringMVC系列(十四)Spring MVC的运行流程
    SpringMVC系列(十三)异常处理
    SpringMVC系列(十二)自定义拦截器
    SpringMVC系列(十一)把后台返回的数据转换成json、文件下载、文件上传
    SpringMVC系列(十)<mvc:default-servlet-handler/>(处理静态资源)和<mvc:annotation-driven />
    SpringMVC系列(九)自定义视图、重定向、转发
    SpringMVC系列(八)国际化
    SpringMVC系列(七)视图解析器和视图
    SpringMVC系列(六)处理模型数据
  • 原文地址:https://www.cnblogs.com/leiGameDesigner/p/6613952.html
Copyright © 2011-2022 走看看