• UGUI 实现Button长按效果(RepeatButton)


    Tag:加入了一个延迟,在button按下状态一段时间后再開始 repeate

    using UnityEngine;
    using UnityEngine.Events;
    using UnityEngine.EventSystems;
    using System.Collections;
    
    public class RepeatPressEventTrigger : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IPointerExitHandler
    {
        public float interval = 0.1f; //回调触发间隔时间;
    
        public float delay = 1.0f;//延迟时间;
    
        public  UnityEvent onLongPress = new UnityEvent();
    
    
        private bool isPointDown = false;
        private float lastInvokeTime;
    
        private float m_Delay = 0f;
    
        // Use this for initialization
        void Start()
        {
            m_Delay = delay;
        }
    
        // Update is called once per frame
        void Update()
        {
            if (isPointDown)
            {
                if ((m_Delay -= Time.deltaTime) > 0f)
                {
                    return;
                }
    
                if (Time.time - lastInvokeTime > interval)
                {
                    //触发点击;
                    onLongPress.Invoke();
                    lastInvokeTime = Time.time;
                }
            }
    
        }
    
        public void OnPointerDown(PointerEventData eventData)
        {
            isPointDown = true;
            m_Delay = delay;
        }
    
        public void OnPointerUp(PointerEventData eventData)
        {
            isPointDown = false;
            m_Delay = delay;
        }
    
        public void OnPointerExit(PointerEventData eventData)
        {
            isPointDown = false;
            m_Delay = delay;
        }
    }
    



    在商店中购买、在背包中出售、使用一种物品的情况下。须要对button进行长按处理,来高速添加或降低 物品个数。在Unity的 GUI中有一个RepeatButton能够用。在NGUI中有OnPressed 回调能够使用,可是在 UGUI 中的 Button 并没有这样的功能。就须要自己加入。


    原理:

    处理 Unity 的点击事件

    IPointerDownHandler
    IPointerUpHandler
    IPointerExitHandler


    在鼠标 按下的状态、松开、以及鼠标离开的状态来进行状态控制。


    代码:

    using UnityEngine;
    using UnityEngine.Events;
    using UnityEngine.EventSystems;
    using System.Collections;
    
    public class RepeatPressEventTrigger :MonoBehaviour,IPointerDownHandler,IPointerUpHandler,IPointerExitHandler
    {
    	public float interval=0.1f;
    
    	[SerializeField]
    	UnityEvent m_OnLongpress=new UnityEvent();
    
    
    	private bool isPointDown=false;
    	private float lastInvokeTime;
    
    	// Use this for initialization
    	void Start ()
    	{
    	}
    	
    	// Update is called once per frame
    	void Update ()
    	{
    		if(isPointDown)
    		{
    			if(Time.time-lastInvokeTime>interval)
    			{
    				//触发点击;
    				m_OnLongpress.Invoke();
    				lastInvokeTime=Time.time;
    			}
    		}
    
    	}
    
    	public void OnPointerDown (PointerEventData eventData)
    	{
    		m_OnLongpress.Invoke();
    
    		isPointDown = true;
    
    		lastInvokeTime = Time.time;
    	}
    
    	public void OnPointerUp (PointerEventData eventData)
    	{
    		isPointDown = false;
    	}
    
    	public void OnPointerExit (PointerEventData eventData)
    	{
    		isPointDown = false;
    	}
    }
    


    用法:

    把脚本挂在 Button 上面 (当然其他控件也能够) 。然后设置 长按的回调函数 以及 调用间隔。


    长按button。就会依照设定的间隔事件 。不停得调用 指定的 OnLongPress 函数。


    样例下载:

    http://download.csdn.net/detail/cp790621656/8794181


  • 相关阅读:
    微信小程序统一管理接口
    微信小程序购物车
    微信小程序表单的取值
    在VS Code中编写IAR项目
    【管理员已阻止你运行此应用】windows defender图标打叉,无法打开mmc.exe解决办法
    Eclipse普通java Project文件路径问题
    【线性表基础】基于线性表的简单算法【Java版】
    【线性表基础】顺序表和单链表的插入、删除等基本操作【Java版】
    Java逆序输出整数
    Java打印实心、空心的三角形和菱形
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/7141022.html
Copyright © 2020-2023  润新知