Files
MinFt/Client/Assets/Scripts/UIExtend/UIButtonDouble.cs
2026-04-27 12:07:32 +08:00

85 lines
2.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using static UnityEngine.EventSystems.ExecuteEvents;
public class UIButtonDouble : Button
{
public int ExecuteCount = 1;
public int curExecuteCount = 0;
private ButtonClickedEvent m_OnDown = new ButtonClickedEvent();
private ButtonClickedEvent m_OnUp = new ButtonClickedEvent();
PointerEventData _pointerEventData;
public PointerEventData PointerEventData => _pointerEventData;
public ButtonClickedEvent onDown
{
get { return m_OnDown; }
set { m_OnDown = value; }
}
public ButtonClickedEvent onUp
{
get { return m_OnUp; }
set { m_OnUp = value; }
}
public override void OnPointerClick(PointerEventData eventData)
{
RaycastThrough(eventData, pointerClickHandler);
base.OnPointerClick(eventData);
}
public override void OnPointerDown(PointerEventData eventData)
{
RaycastThrough(eventData, pointerDownHandler);
m_OnDown.Invoke();
base.OnPointerDown(eventData);
}
public override void OnPointerUp(PointerEventData eventData)
{
RaycastThrough(eventData, pointerUpHandler);
m_OnUp.Invoke();
base.OnPointerUp(eventData);
}
public void RaycastThrough<T>(BaseEventData baseEventData, EventFunction<T> eventFunction) where T : IEventSystemHandler
{
_pointerEventData = (PointerEventData)baseEventData;
List<RaycastResult> raycastResults = new List<RaycastResult>();
//当前处理的gameobject
GameObject currentObj = gameObject ?? _pointerEventData.pointerDrag;
//获取当前射线检测到的所有结果
EventSystem.current.RaycastAll(_pointerEventData, raycastResults);
curExecuteCount = 0;
bool isExecute = false;
for (int i = 0; i < raycastResults.Count; i++)
{
//}
//foreach (var item in raycastResults)
//{
var item = raycastResults[i];
GameObject nextObj = item.gameObject;
if (nextObj != null && nextObj == currentObj)
{
isExecute = true;
}
if (isExecute && nextObj != null && nextObj != currentObj)
{
GameObject excuteObj = GetEventHandler<T>(nextObj);
if (excuteObj != null && excuteObj != currentObj)
{
//执行下一层事件,如果你还需要继续执行下面层UI事件可以不return我这里只检测下一层的所以我循环一次就直接return
Execute(excuteObj, _pointerEventData, eventFunction);
}
curExecuteCount++;
if (curExecuteCount >= ExecuteCount)
{
return;
}
}
}
}
}