Unity UGUI实现点击事件穿透

 代码很简单如下 将此代码挂载到上层节点上即可

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>();
        //获取射线检测结果
        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没响应问题

如果只传递一层的情况 Button的Text文本 或者Button下面有遮挡物 并且Raycast Target是true的情况它会传递给Text或者 其他遮挡物 而Button 不会收到点击消息 所以如果想要下层百分百生效 最好的情况是 把Button 下面的遮挡物 Raycast Target设置为false 因为如果一直往下传递的话 当前点击的位置无论叠加多少层Button 他都会响应 所以一直往下传递是不可控的情况

2.下层Toggle没响应问题

再有一种情况是Toggle 我在UI上的Toggle 自身没有Image 组件 Toggle的Target Graphic 设置的是Background 然后事件传递到Backgeround 之后 Toggle并没有响应 所以如果想让Toggle也响应该事件 需要将Toggle的Target Graphic设置为自身 给Toggle添加一个Image 并且Raycast Target 设置为true 并且没有遮挡物即可

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小张不爱写代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值