【Unity】Button组件Bug总结:按钮失灵、穿透
首先简单理一下如何使用UGUI的按钮:
Hierarchy右键,UI > Button (Button - TextMesh Pro)
On Click() 处选择回调函数,或者代码中执行
button.onClick.AddListener(ClickFunctionName);
这样整套操作下来基本不会遇到问题,但很多时候,程序员卡皮巴拉处理的UGUI界面并不是自己做的,或者经手动画师无敌暴龙战士二次加工过。这样一来就会发生一些神奇的事情。
Raycast Target
- ,可视为光线投射的目标
- ,不视为光线投射的目标
每个Button组件都会关联一个Target Graphic,这对应一个Image组件,Raycast Target参数决定了组件是否会响应射线检测,Button事件的触发就依赖于射线检测,所以此参数不勾选,按钮就不响应。
Interactable
顾名思义,此参数决定Button是否可交互,算是官方开关,需要注意此参数为false时,按钮的颜色会被更改为Disabled Color,默认就会半透明,有时候这很画蛇添足。
Canvas 与 Graphic Raycaster
- 如果某节点添加了Canvas组件但是没有添加Graphic Raycaster组件,那么这一节点以及其所有子节点的射线检测都会失效,即使父节点Canvas有相应的Graphic Raycaster也会失效;
- Ignore Reversed Graphics 默认勾选,射线检测只在一面有效,如果翻转按钮,按钮就会失灵;
- 很容易忽略的一件事,Canvas Group也必须配合Graphic Raycaster使用,射线检测才不会失效,在这点上,Canvas Group和Canvas是等效的。
Maskable
首先,如果两张重叠的Image都勾选了Raycast Target,那么层级高的Image会遮挡层级低的Image,这是避免按钮穿透非常常用的方法。
此方法生效有一个前提,那就是层级高的Image的Maskable值为true。
其他
还有一种很蠢的可能,但是不可忽视。UGUI组件生效的前提是组件处于激活状态,如果组件未激活,那与之相关的所有属性都不会生效。如果挂载组件的对象都没激活那就更不会生效。这种情况是有可能被忽略的,比如做一个透明按钮的时候,开发者意识不到对象是否激活。所以遇到BUG时还要检查运行态各个对象、组件的状态是否满足期待。