?代碼很簡(jiǎn)單如下 將此代碼掛載到上層節(jié)點(diǎn)上即可
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
public class ClickEventPenetration : MonoBehaviour, IPointerClickHandler
{
public void OnPointerClick(PointerEventData eventData)
{
PassEvent(eventData, ExecuteEvents.pointerClickHandler);
}
private void PassEvent<T>(PointerEventData pointerEventData, ExecuteEvents.EventFunction<T> eventFunction) where T : IEventSystemHandler
{
List<RaycastResult> raycastResults = new List<RaycastResult>();
//獲取射線檢測(cè)結(jié)果
EventSystem.current.RaycastAll(pointerEventData, raycastResults);
for (int i = 0; i < raycastResults.Count; i++)
{
GameObject resultGameObject = raycastResults[i].gameObject;
//如果不是自身則將事件傳遞下去
if (resultGameObject != null && resultGameObject != this.gameObject)
{
//目前只是傳遞一層如需多層把break去掉即可
ExecuteEvents.Execute(resultGameObject, pointerEventData, eventFunction);
break;
}
}
}
}
使用此方案遇到的一些問題以及處理方法
1.下層Button沒響應(yīng)問題
如果只傳遞一層的情況 Button的Text文本 或者Button下面有遮擋物 并且Raycast Target是true的情況它會(huì)傳遞給Text或者 其他遮擋物 而Button 不會(huì)收到點(diǎn)擊消息 所以如果想要下層百分百生效 最好的情況是 把Button 下面的遮擋物 Raycast Target設(shè)置為false 因?yàn)槿绻恢蓖聜鬟f的話 當(dāng)前點(diǎn)擊的位置無論疊加多少層Button 他都會(huì)響應(yīng) 所以一直往下傳遞是不可控的情況
2.下層Toggle沒響應(yīng)問題文章來源:http://www.zghlxwxcb.cn/news/detail-845398.html
再有一種情況是Toggle 我在UI上的Toggle 自身沒有Image 組件 Toggle的Target Graphic 設(shè)置的是Background 然后事件傳遞到Backgeround 之后 Toggle并沒有響應(yīng) 所以如果想讓Toggle也響應(yīng)該事件 需要將Toggle的Target Graphic設(shè)置為自身 給Toggle添加一個(gè)Image 并且Raycast Target 設(shè)置為true 并且沒有遮擋物即可文章來源地址http://www.zghlxwxcb.cn/news/detail-845398.html
到了這里,關(guān)于Unity UGUI實(shí)現(xiàn)點(diǎn)擊事件穿透的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!