UI事件是相互遮挡的,ui通过下述代码事件可以向下渗透,转载https://www.xuanyusong.com/archives/4241
using UnityEngine; using System.Collections; using UnityEngine.EventSystems; using UnityEngine.UI; using System.Collections.Generic; public class UIEventPass : MonoBehaviour, IPointerClickHandler, IPointerDownHandler, IPointerUpHandler { //监听按下 public void OnPointerDown(PointerEventData eventData) { PassEvent(eventData, ExecuteEvents.pointerDownHandler); Debug.Log("Click"); } //监听抬起 public void OnPointerUp(PointerEventData eventData) { PassEvent(eventData, ExecuteEvents.pointerUpHandler); } //监听点击 public void OnPointerClick(PointerEventData eventData) { PassEvent(eventData, ExecuteEvents.submitHandler); PassEvent(eventData, ExecuteEvents.pointerClickHandler); } //把事件透下去 public void PassEvent<T>(PointerEventData data, ExecuteEvents.EventFunction<T> function) where T : IEventSystemHandler { List<RaycastResult> results = new List<RaycastResult>(); EventSystem.current.RaycastAll(data, results); GameObject current = data.pointerCurrentRaycast.gameObject; for (int i = 0; i < results.Count; i++) { //if (i == 0) continue; if (current != results[i].gameObject) { ExecuteEvents.Execute(results[i].gameObject, data, function); //RaycastAll后ugui会自己排序,如果你只想响应透下去的最近的一个响应,这里ExecuteEvents.Execute后直接break就行。 //break; } } } }