1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEngine; 4 using UnityEngine.EventSystems; 5 6 7 public class UIRaycastPass : MonoBehaviour,IPointerClickHandler ,IPointerDownHandler,IPointerUpHandler 8 { 9 //监听按下 10 public void OnPointerDown(PointerEventData eventData) 11 { 12 PassEvent(eventData, ExecuteEvents.pointerDownHandler); 13 } 14 15 //监听抬起 16 public void OnPointerUp(PointerEventData eventData) 17 { 18 PassEvent(eventData, ExecuteEvents.pointerUpHandler); 19 } 20 21 //监听点击 22 public void OnPointerClick(PointerEventData eventData) 23 { 24 PassEvent(eventData, ExecuteEvents.submitHandler); 25 PassEvent(eventData, ExecuteEvents.pointerClickHandler); 26 } 27 28 29 //把事件透下去 30 public void PassEvent<T>(PointerEventData data, ExecuteEvents.EventFunction<T> function) 31 where T : IEventSystemHandler 32 { 33 List<RaycastResult> results = new List<RaycastResult>(); 34 EventSystem.current.RaycastAll(data, results); 35 GameObject current = data.pointerCurrentRaycast.gameObject; 36 for (int i = 0; i < results.Count; i++) 37 { 38 if (current != results[i].gameObject) 39 { 40 ExecuteEvents.Execute(results[i].gameObject, data, function); 41 //RaycastAll后ugui会自己排序,如果你只想响应透下去的第一个响应,这里ExecuteEvents.Execute后直接break就行。 42 //break; 43 } 44 } 45 } 46 47 }
之后我用这个工具开发了一套引导流程,之后有机会写出来,有一些思路和实现