using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
using System.Collections.Generic;
using System;
using UnityEngine.UI;
using UnityEngine.Events;
/**
* 触摸点击事件,大部分来自于Button
*
*/
public class UITouchClick : MonoBehaviour,
IPointerDownHandler, IPointerUpHandler, IPointerClickHandler
{
//记录按下的物体
public GameObject _onPointerDownObj;
/// <summary>
/// 是否可以穿透事件
/// </summary>
public bool canPassEvent;
public void OnPointerDown(PointerEventData eventData)
{
if (canPassEvent) this.PassEvent(eventData, ExecuteEvents.pointerDownHandler);
}
public void OnPointerClick(PointerEventData eventData)
{
this.CancelInvoke();
if (canPassEvent) this.PassEvent(eventData, ExecuteEvents.pointerClickHandler);
this.OnTriggerClick();
}
public void OnPointerUp(PointerEventData eventData)
{
if (canPassEvent) this.PassEvent(eventData, ExecuteEvents.pointerUpHandler);
}
public Action onClick;
public void OnTriggerClick()
{
onClick?.Invoke();
}
public void OnTriggerPress()
{
}
/// <summary>
/// 主动向下穿透
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="data"></param>
/// <param name="function"></param>
public void PassEvent<T>(PointerEventData data,
ExecuteEvents.EventFunction<T> function) where T : IEventSystemHandler
{
var results = new List<RaycastResult>();
EventSystem.current.RaycastAll(data, results);
var current = data.pointerCurrentRaycast.gameObject;
_onPointerDownObj = null;
foreach (var raycast in results)
{
if (current == raycast.gameObject) continue;
if (gameObject == raycast.gameObject) continue;
//点到自己的Panel层
if (raycast.gameObject.name == "guidepanelbg") continue;
//判断穿透对象是否是需要要点击的对象
if (ExecuteEvents.Execute(raycast.gameObject, data, function))
{
if (function.GetType() == ExecuteEvents.pointerDownHandler.GetType() && _onPointerDownObj == null)
{
_onPointerDownObj = raycast.gameObject;
}
break;
}
}
if (function.GetType() == ExecuteEvents.pointerUpHandler.GetType() && _onPointerDownObj != null)
{
//ExecuteEvents.Execute(_onPointerDownObj, data, function);
afterPass?.Invoke(_onPointerDownObj.name,()=> {
ExecuteEvents.Execute(_onPointerDownObj, data, function);
});
}
}
public Action<string,Action> afterPass;
}
06-09
430
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
11-08
300
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
06-09
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交