- 假如Button被一个Image遮挡,则正常情况这个Button被挡住的地方无法接收点击。
- 如果想让被挡住部分也接收,则就要把事件从Image中传递下去。(脚本挂在Image上)
using UnityEngine; using UnityEngine.EventSystems; using System.Collections.Generic; public class Test : MonoBehaviour, IPointerClickHandler ,IPointerDownHandler,IPointerUpHandler { //监听按下 public void OnPointerDown(PointerEventData eventData) { PassEvent(eventData,ExecuteEvents.pointerDownHandler); } //监听抬起 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(current!= results[i].gameObject) { ExecuteEvents.Execute(results[i].gameObject, data,function); //RaycastAll后ugui会自己排序,如果你只想响应透下去的第一个响应,这里ExecuteEvents.Execute后直接break就行。 //break; } } } }
- 上述代码中,继承需要监听的类,并且实现对应方法。
- 在方法中,可以取到eventData对象,使用EventSystem.current.RaycastAll()方法找到所有能传递点击事件的对象,最后使用ExcuteEvents.Execute()方法将事件传递给需要的对象。
- 只要脚本还激活中,那么就可以穿过Image点击到Button。前提是要点击在被遮挡住的地方。
01-16
1550