神奇的按钮 穿透(bug)

后面的图层有按钮A
中间的图层是一个触摸屏蔽层
前面的图层有按钮B,B在A的上方

当B可点时一切正常
当B不可点时,点击B,A会相应。可是中间还有一个触摸屏蔽层

麻烦大神解释一下…

说实话,你做个demo,让引擎人员测试一下,你这么说,很容易会没人理你的。。。
而且不知道是不是你自己的代码的问题,最好有demo

这样啊,好吧;demo怎么给他们?

直接把 demo 弄成一个 zip 包上传到这个帖子里面。

NewProject.zip (878.3 KB)

最底层是Hello层,注册了点击事件

中间是屏蔽层,

上是按钮B,C
C是不可点的状态,点击C可以直接穿过中间的屏蔽层,到达Hello层

屏蔽层是不是没注册触摸事件?如果没注册只是放一个图层在那里是挡不住触摸的

注册了的,上面有demo压缩包,

你的btn_c的interacable属性没勾,btn_c被禁用了

问题就是点击一个禁用的按钮,点击事件会穿过中间的屏蔽层,到达下层按钮或者下层有触摸监听的图层。就好像禁用的按钮是屏蔽层开的后门

你的层级结构

  • Canvas (响应触摸,打印 hello)
    • btn A (响应触摸,打印 A)
    • maskLayer (响应触摸,打印 屏蔽图层)
    • btn B (响应触摸,打印 B)
    • btn C (不响应触摸,打印 C)

btn C 虽然是 interactable 为 false,但是 button 组件依然是 enable 的,所以还是会截获事件,只是自身不会响应,那么他会忽略了自身的 button 回调之后,会 propagate 给自己的父节点,也就是 Canvas。

这个行为是目前设计如此,具体原因要问 @zilong

Button 的 interactable 的设计是 button 本身的行为控制的一个属性,如果为 false,则 Button 自身的逻辑处理会暂时屏蔽。(但是并不影响事件的侦听,因为你可能需要动态地激活和反激活 Button)

而组件的事件注册和反注册,为了统一,我们所有的 UI 组件都是在 onEable 和 onDisable 的时候注册和反注册的。

:grin:通俗易懂,明白了,感谢简惑!

好吧!看来就是没办法了,我已经迂回得解决了我的问题。谢谢简惑!

借贵宝地问一下,上面说的事件,是不是指的是Button组件挂载的Node上添加的监听事件?而interactable针对的是Button组件中通过ClickEvents添加的事件?

恩,可以这么理解。Button 的 interactable 不仅影响 事件,还影响行为,比如说不会做 Transition 了。