zoukankan      html  css  js  c++  java
  • Unity3d使用UGUI实现长按功能

      UGUI的Button组件只有OnClick事件的监听,要实现长按功能,要监听按下事件和抬起事件,所以要使用到EventTrigger组件中的OnPointerDown和OnPointerUp来监听。

    为了方便,把EventTrigger中的事件监听都封装起来,我是使用了雨松MOMO写的EventTriggerListener,用起来很方便,地址:http://www.xuanyusong.com/archives/3325

    代码:

    using UnityEngine;
    using System.Collections;
    using UnityEngine.EventSystems;
    public class EventTriggerListener : UnityEngine.EventSystems.EventTrigger
    {
        public delegate void VoidDelegate(GameObject go);
        public delegate void BoolDelegate(GameObject go, bool state);
        public delegate void FloatDelegate(GameObject go, float delta);
        public delegate void VectorDelegate(GameObject go, Vector2 delta);
        public delegate void ObjectDelegate(GameObject go, GameObject obj);
        public delegate void KeyCodeDelegate(GameObject go, KeyCode key);
    
        public VoidDelegate onClick;
        public VoidDelegate onDown;
        public VoidDelegate onEnter;
        public VoidDelegate onExit;
        public VoidDelegate onUp;
        public VoidDelegate onSelect;
        public VoidDelegate onUpdateSelect;
    
        static public EventTriggerListener Get(GameObject go)
        {
            EventTriggerListener listener = go.GetComponent<EventTriggerListener>();
            if (listener == null) listener = go.AddComponent<EventTriggerListener>();
            return listener;
        }
    
        static public EventTriggerListener Get(Transform transform)
        {
            EventTriggerListener listener = transform.GetComponent<EventTriggerListener>();
            if (listener == null) listener = transform.gameObject.AddComponent<EventTriggerListener>();
            return listener;
        }
        public override void OnPointerClick(PointerEventData eventData)
        {
            if (onClick != null) onClick(gameObject);
        }
        public override void OnPointerDown(PointerEventData eventData)
        {
            if (onDown != null) onDown(gameObject);
        }
        public override void OnPointerEnter(PointerEventData eventData)
        {
            if (onEnter != null) onEnter(gameObject);
        }
        public override void OnPointerExit(PointerEventData eventData)
        {
            if (onExit != null) onExit(gameObject);
        }
        public override void OnPointerUp(PointerEventData eventData)
        {
            if (onUp != null) onUp(gameObject);
        }
        public override void OnSelect(BaseEventData eventData)
        {
            if (onSelect != null) onSelect(gameObject);
        }
        public override void OnUpdateSelected(BaseEventData eventData)
        {
            if (onUpdateSelect != null) onUpdateSelect(gameObject);
        }
    }

    使用EventTriggerListener的Get方法就可以了,和NGUI的UIEventListener一样。

    例如:

    EventTriggerListener.Get(gameObject).onDown += OnClickDown;
    EventTriggerListener.Get(gameObject).onUp += OnClickUp;

    然后在场景中添加一个按钮

    然后再按钮上挂一个事件监听的脚本,譬如我要做一个类似技能CD冷却的效果,点击开始遮罩,松开恢复原状。

    脚本如下:

    using UnityEngine;
    using System.Collections;
    using UnityEngine.UI;
    
    public class EventTest : MonoBehaviour {
    
        private bool isUp;
        private Image img;
        void Start () {
            /*EventTriggerListener.Get(gameObject).onDown += (go) => { Debug.Log("按下!"); };
            EventTriggerListener.Get(gameObject).onUp += (go) => { Debug.Log("抬起!"); };
            EventTriggerListener.Get(gameObject).onSelect += (go) => { Debug.Log("选中!"); };
            EventTriggerListener.Get(gameObject).onEnter += (go) => { Debug.Log("进入!"); };
            EventTriggerListener.Get(gameObject).onExit += (go) => { Debug.Log("退出!"); };
             * */
    
            img = transform.Find("Image").GetComponent<Image>();
            EventTriggerListener.Get(gameObject).onDown += OnClickDown;
            EventTriggerListener.Get(gameObject).onUp += OnClickUp;
    
        }
        void OnClickDown(GameObject go)
        {
            isUp = false;
            StartCoroutine(grow());
        }
    
        void OnClickUp(GameObject go)
        {
            isUp = true;
            img.fillAmount = 0f;
        }
    
    
    
        private IEnumerator grow()
        {
            while (true)
            {
                if (isUp)
                {                
                    break;
                }
                img.fillAmount += 0.5f * Time.deltaTime;
                if (img.fillAmount == 0)
                {
                    break;
                }
                yield return null;
            }
        }
    
    }

    长按效果:

  • 相关阅读:
    Sublime Text 3 安装插件管理 Package Control
    Sublime Text 2&3中输入法不跟随光标移动的问题的解决方法
    Centos 7 yum 安装php
    Centos 7 yum 安装Apache
    正则验证多个邮箱用分号隔开
    Linux下修改网卡IP、DNS和网关
    mysqldump when doing LOCK TABLES问题
    jQuery遍历json
    Yii中CDbCriteria常用方法
    Parse error: syntax error, unexpected T_PUBLIC in 问题解决
  • 原文地址:https://www.cnblogs.com/townsend/p/4209065.html
Copyright © 2011-2022 走看看