扩展类:
public static class EventTriggerEx
{
/// <summary>
/// Transform扩展添加 EventTrigger 事件
/// </summary>
/// <param name="trs"></param>
/// <param name="eventID">事件类型</param>
/// <param name="callback">事件回调</param>
public static void AddTrsEntryTriggerEvent(this Transform trs, EventTriggerType eventID, UnityEngine.Events.UnityAction<BaseEventData> callback)
{
EventTrigger trigger = null;
trigger = trs.GetComponent<EventTrigger>();
if (trigger == null)
{
trigger = trs.gameObject.AddComponent<EventTrigger>();
}
var entry = trigger.triggers.Find((_entry) => { return _entry.eventID == eventID; });
if (entry == null)
{
entry = new EventTrigger.Entry();
entry.eventID = eventID;
trigger.triggers.Add(entry);
}
entry.callback.AddListener(callback);
}
/// <summary>
/// 检查鼠标是否在UI上
/// </summary>
/// <param name="uiPanel"></param>
/// <returns></returns>
public static bool IsPointerOverUI()
{
PointerEventData pointerEventData = new PointerEventData(EventSystem.current);
pointerEventData.position = Input.mousePosition;
List<RaycastResult> result = new List<RaycastResult>();
EventSystem.current.RaycastAll(pointerEventData, result);
if (result.Count > 0)
return true;
else
return false;
}
/// <summary>
/// 检查鼠标是否在目标UI上
/// </summary>
/// <param name="uiPanel"></param>
/// <returns></returns>
public static bool IsPointerOverUI(this Transform uiPanel)
{
if (EventSystem.current.IsPointerOverGameObject())
{
PointerEventData pointerEventData = new PointerEventData(EventSystem.current);
pointerEventData.position = Input.mousePosition;
List<RaycastResult> result = new List<RaycastResult>();
EventSystem.current.RaycastAll(pointerEventData, result);
if (result.Count > 0)
foreach (var item in result)
{
if (item.gameObject == uiPanel.gameObject|| item.gameObject.transform.IsChildOf(uiPanel)) return true;
}
}
return false;
}
/// <summary>
/// 多个个 检查值
/// </summary>
/// <param name="uiPanel"></param>
/// <returns></returns>
public static bool IsPointerOverUI(List<Transform> uiPanels)
{
if (EventSystem.current.IsPointerOverGameObject())
{
PointerEventData pointerEventData = new PointerEventData(EventSystem.current);
pointerEventData.position = Input.mousePosition;
List<RaycastResult> result = new List<RaycastResult>();
EventSystem.current.RaycastAll(pointerEventData, result);
if (result.Count > 0)
foreach (var item in result)
{
if (uiPanels != null) return false;
foreach (var u in uiPanels)
{
if (item.gameObject == u.gameObject || item.gameObject.transform.IsChildOf(u)) return true;
}
}
}
return false;
}
/// <summary>
/// 返回单个个UI检查值
/// </summary>
/// <param name="uiPanel"></param>
/// <param name="mouseStatus"></param>
/// <returns></returns>
public static bool IsPointerOverUI(this Transform uiPanel, MouseStatus mouseStatus = MouseStatus.DownAndWheel)
{
switch (mouseStatus)
{
case MouseStatus.DownAndWheel:
if (Input.GetMouseButtonDown(0) || Input.GetMouseButtonDown(1) || Input.GetAxis("Mouse ScrollWheel") != 0)
{
return IsPointerOverUI(uiPanel);
}
return false;
case MouseStatus.Down:
if (Input.GetMouseButtonDown(0) || Input.GetMouseButtonDown(1))
{
return IsPointerOverUI(uiPanel);
}
return false;
case MouseStatus.Up:
if (Input.GetMouseButtonUp(0) || Input.GetMouseButtonUp(1))
{
return IsPointerOverUI(uiPanel);
}
return false;
case MouseStatus.UpAndWheel:
if (Input.GetMouseButtonUp(0) || Input.GetMouseButtonUp(1) || Input.GetAxis("Mouse ScrollWheel") != 0)
{
return IsPointerOverUI(uiPanel);
}
return false;
}
return false;
}
/// <summary>
/// 返回多个UI检查值
/// </summary>
/// <param name="uiPanels"></param>
/// <param name="mouseStatus"></param>
/// <returns></returns>
public static bool IsPointerOverUI(this List<Transform> uiPanels, MouseStatus mouseStatus = MouseStatus.DownAndWheel)
{
switch (mouseStatus)
{
case MouseStatus.DownAndWheel:
if (Input.GetMouseButtonDown(0) || Input.GetMouseButtonDown(1) || Input.GetAxis("Mouse ScrollWheel") != 0)
{
return IsPointerOverUI(uiPanels);
}
return false;
case MouseStatus.Down:
if (Input.GetMouseButtonDown(0) || Input.GetMouseButtonDown(1))
{
return IsPointerOverUI(uiPanels);
}
return false;
case MouseStatus.Up:
if (Input.GetMouseButtonUp(0) || Input.GetMouseButtonUp(1))
{
return IsPointerOverUI(uiPanels);
}
return false;
case MouseStatus.UpAndWheel:
if (Input.GetMouseButtonUp(0) || Input.GetMouseButtonUp(1) || Input.GetAxis("Mouse ScrollWheel") != 0)
{
return IsPointerOverUI(uiPanels);
}
return false;
}
return false;
}
/// <summary>
/// 鼠标可选状态
/// </summary>
public enum MouseStatus
{
Down = 0,//左右键按下去
Up = 1,//左右键抬起
DownAndWheel = 2,//左右键按下去+滑轮
UpAndWheel = 3,//左右键抬起+滑轮
}
}
测试类: