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

    到这里,大功告成啦!

  • 相关阅读:
    Tomcat下HTTPS双向认证配置以及客户端调用案例
    Java本地运行中文正常,部署到Weblogic中文乱码
    gson 忽略掉某些字段不进行转换
    JavaScript中定义对象的四种方式
    使用CSS3实现超炫的Loading(加载)动画效果
    不要再使用JS框架了
    HTML5, CSS3, ES5新的web标准和浏览器支持一览 转
    js常用的事件对象
    jQuery用面向对象的思想来编写验证表单的插件
    五个值得尝试的前端开发工具
  • 原文地址:https://www.cnblogs.com/leiGameDesigner/p/6613952.html
Copyright © 2020-2023  润新知