好吧,其实是我刚刚运行公司程序的时候发现了一个比较抽象的bug,做一个按钮的点击,点击后播放视频,但是呢因为视频需要外部加载,于是我寻思着,做成一个隐藏的常驻组件,放在场景里,有需要调用就行,然后按钮的功能点击把组件激活,然后播放视频即可如图
绿色的就是按钮的可点击范围,点击之后会激活video组件,播放视频如下图
然后呢,主管提了个需求:
这个视频,它不太好看,你能不能做个圆角?
我:(心理活动: &###&)¥%@&¥@ 得加钱! )也不是不行,就是你得给我一张遮罩
对,这个遮罩,后边要考
经过我一番操作,做好啦效果如下图
然后按钮恰恰好有一部分被这个遮住了,不过我点了mask的隐藏遮罩,所以我看不到。
于是出现了如下bug
第一次进入的时候,可以正常点击,视频开始,然后关闭之后按钮大部分无法点击,但是部分位置可以点击,同时,这个特性会继承到下一个资源卡进入,但是从第三张卡进入就会消失,点击视频关闭之后又会出现如下bug
分析原因
首先,是否只有这个按钮有这个问题,开一个新项目开启开关按钮,排除按钮原因
然后,按钮点击事件是否改变了按钮的范围图片,直接看button组件targetgraphic所指向的图的alpha值,查看发现并没有存在被修改的问题,排除
之后就是遮挡了,存不存在和其它图片重合之类的问题,这个最难判断,在复现bug的时候我发现,这个按钮的图片和遮罩的图片重合了,点开遮罩图片的属性
答案
好答案已经呼之欲出了,遮罩的图片虽然被隐藏了,但是可以被点击的,只要把这个raycast target取消勾选就可以完美解决这个bug,原因就是虽然看不见这张图了,但它就是盖住了按钮,而且是可以被射线检测到的,而点击事件触发方式就是射线加鼠标按下,满足就可以触发,所以问题解决了。
总结
对于一些bug,通过表现猜测可能的原因,分别从行为,代码,以及可能涉及到的原理进行猜测并加以验证,虽然说有些时候会出现不符合直觉的可能情况(比如这个隐藏的遮罩会遮住按钮的判定范围),只要可能存在就可以去试试,多累计经验,找错很快的