使用委托完成长按等各种点击事件以及不同的触发类型的处理

话不多说,前提条件:
1、Physics Raycaster(放在Camera下)
2、EventSystem组件
然后,挂上脚本:

public class PressedManager : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IPointerExitHandler
{
	public Action downAction;
	public Action upAction;
	public Action pressedAction;
	public Action exitAction;
	public float delay = 0.2f;
	public PressedType type;
	public float continuousDelay = 0f;
	private bool isPresseding = false;
	private bool isDown = false;// 按钮是否是按下状态
	private bool isOnce = false;//判断是否第一次触发
	private float lastIsDownTime;// 按钮最后一次是被按住状态时候的时间
	public enum PressedType {
		once,//触发一次
		continuous,//连续触发
	}
	public void OnPointerDown(PointerEventData eventData)
	{
		downAction?.Invoke();
		isDown = true;
		lastIsDownTime = Time.time;
	}

	// 当按钮抬起的时候自动调用此方法
	public void OnPointerUp(PointerEventData eventData)
	{
		upAction?.Invoke();
		isDown = false;
		isPresseding = false;
		isOnce = false;
	}

	// 当鼠标从按钮上离开的时候自动调用此方法
	public void OnPointerExit(PointerEventData eventData)
	{
		exitAction?.Invoke();
	}
	void Update()
	{
		// 如果按钮是被按下状态
		if (isDown)
		{
			// 当前时间 -  按钮最后一次被按下的时间 > 延迟时间0.2秒
			if (Time.time - lastIsDownTime > delay)
			{
				// 触发长按方法
				isPresseding = true;
				if (type == PressedType.once&&!isOnce)
				{
					isOnce = true;
					pressedAction?.Invoke();
					Debug.Log("啊啊啊啊,我一次了。");
				}
				// 记录按钮最后一次被按下的时间
				lastIsDownTime = Time.time;

			}
			if(Time.time - lastIsDownTime > continuousDelay && isPresseding)
			{
				if (type == PressedType.continuous)
				{
					pressedAction?.Invoke();
					Debug.Log("啊啊啊啊,我又来了。");
				}
				// 记录按钮最后一次被按下的时间
				lastIsDownTime = Time.time;
			}
		}

	}
}

然后在处理方法的脚本的awake或者start方法内把方法加进委托内:
先声明一个PressedManager :

 public PressedManager pressed;

然后按照需要加进不同的委托内
无参数:

pressed.pressedAction += 方法名;

有参数时用lambda表达式:

pressed.pressedAction += ()=>方法;

111
参数说明:
delay :长按多久触发长按
type: continuous触发长按之后连续触发;once触发长按之后只触发一次
continuousDelay : 连续触发间隔时间

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值