You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

142 lines
4.2 KiB

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using UnityEngine.UI;
using UltraCombos;
public class TouchArea : MonoBehaviour, IPointerDownHandler, IDragHandler, IPointerExitHandler, IPointerUpHandler, IPointerEnterHandler, IPointerClickHandler
{
[HideInInspector]
public Image img;
public bool MouseOnly = false;
[System.Serializable]
public class OnPointerEnterEvent : UnityEvent<PointerEventData> { };
public OnPointerEnterEvent PointerEnter = new OnPointerEnterEvent();
[System.Serializable]
public class OnPointerDownEvent : UnityEvent<PointerEventData> { };
public OnPointerDownEvent PointerDown = new OnPointerDownEvent();
[System.Serializable]
public class OnPointerDragEvent : UnityEvent<PointerEventData> { };
public OnPointerDragEvent PointerDrag = new OnPointerDragEvent();
[System.Serializable]
public class OnRayHitEvent : UnityEvent<PointerEventData> { };
public OnRayHitEvent RayHit = new OnRayHitEvent();
[System.Serializable]
public class OnRayNoHitEvent : UnityEvent<PointerEventData> { };
public OnRayNoHitEvent RayNoHit = new OnRayNoHitEvent();
[System.Serializable]
public class OnPointerUpEvent : UnityEvent<PointerEventData> { };
public OnPointerUpEvent PointerUp = new OnPointerUpEvent();
[System.Serializable]
public class OnPointerClickEvent : UnityEvent<PointerEventData> { };
public OnPointerClickEvent PointerClick = new OnPointerClickEvent();
[System.Serializable]
public class OnPointerExitEvent : UnityEvent<PointerEventData> { };
public OnPointerExitEvent PointerExit = new OnPointerExitEvent();
EventSystem eventSystem;
GlobalMKHookInputModule inputmodule;
private void Awake()
{
img = GetComponent<Image>();
inputmodule = GameObject.Find("UCEventSystem").GetComponent<GlobalMKHookInputModule>();
}
private void Update()
{
if (inputmodule != null)
{
CheckRayCast();
}
}
void CheckRayCast()
{
if (RayNoHit != null)
RayNoHit.Invoke(null);
foreach (PointerEventData pointerdata in inputmodule.GetPointerDatas.Values)
{
List<RaycastResult> raycastResult = new List<RaycastResult>();
EventSystem.current.RaycastAll(pointerdata, raycastResult);
if(raycastResult.Count != 0)
{
foreach(RaycastResult result in raycastResult)
{
if(result.gameObject == gameObject)
{
RayHit.Invoke(pointerdata);
}
}
}
}
}
public void OnPointerDown(PointerEventData eventData)
{
if (PointerDown == null)
return;
if (skip_on_mouse_only(eventData))
return;
PointerDown.Invoke(eventData);
}
public void OnDrag(PointerEventData eventData)
{
if (PointerDrag == null)
return;
if (skip_on_mouse_only(eventData))
return;
PointerDrag.Invoke(eventData);
}
public void OnPointerUp(PointerEventData eventData)
{
if (PointerUp == null)
return;
if (skip_on_mouse_only(eventData))
return;
PointerUp.Invoke(eventData);
}
public void OnPointerExit(PointerEventData eventData)
{
if (PointerExit == null)
return;
if (skip_on_mouse_only(eventData))
return;
PointerExit.Invoke(eventData);
}
public void OnPointerEnter(PointerEventData eventData)
{
if (PointerEnter == null)
return;
if (skip_on_mouse_only(eventData))
return;
PointerEnter.Invoke(eventData);
}
public void OnPointerClick(PointerEventData eventData)
{
if (PointerClick == null)
return;
if (skip_on_mouse_only(eventData))
return;
PointerClick.Invoke(eventData);
}
private bool skip_on_mouse_only(PointerEventData eventData)
{
return MouseOnly && eventData.pointerId != -1;
}
}