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


原文地址:https://www.cnblogs.com/wzjhoutai/p/7141022.html