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 { }; public OnPointerEnterEvent PointerEnter = new OnPointerEnterEvent(); [System.Serializable] public class OnPointerDownEvent : UnityEvent { }; public OnPointerDownEvent PointerDown = new OnPointerDownEvent(); [System.Serializable] public class OnPointerDragEvent : UnityEvent { }; public OnPointerDragEvent PointerDrag = new OnPointerDragEvent(); [System.Serializable] public class OnRayHitEvent : UnityEvent { }; public OnRayHitEvent RayHit = new OnRayHitEvent(); [System.Serializable] public class OnRayNoHitEvent : UnityEvent { }; public OnRayNoHitEvent RayNoHit = new OnRayNoHitEvent(); [System.Serializable] public class OnPointerUpEvent : UnityEvent { }; public OnPointerUpEvent PointerUp = new OnPointerUpEvent(); [System.Serializable] public class OnPointerClickEvent : UnityEvent { }; public OnPointerClickEvent PointerClick = new OnPointerClickEvent(); [System.Serializable] public class OnPointerExitEvent : UnityEvent { }; public OnPointerExitEvent PointerExit = new OnPointerExitEvent(); EventSystem eventSystem; GlobalMKHookInputModule inputmodule; private void Awake() { img = GetComponent(); inputmodule = GameObject.Find("UCEventSystem").GetComponent(); } private void Update() { if (inputmodule != null) { CheckRayCast(); } } void CheckRayCast() { if (RayNoHit != null) RayNoHit.Invoke(null); foreach (PointerEventData pointerdata in inputmodule.GetPointerDatas.Values) { List raycastResult = new List(); 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) { Debug.Log("Exit:" + gameObject.name); if (PointerExit == null) return; if (skip_on_mouse_only(eventData)) return; PointerExit.Invoke(eventData); } public void OnPointerEnter(PointerEventData eventData) { Debug.Log("Enter:" + gameObject.name); 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; } }