Unity 不忽略 "Ignore Raycast" 层中的按钮单击

Unity not ignoring button click in "Ignore Raycast" layer

我创建了一个新场景来测试 unity 2018.2.6f1 中的 'Ignore Raycast' 图层功能。该场景只是一个附加了日志脚本的 UI 按钮。当我将按钮层更改为'Ignore Raycast'时,按钮仍然有效。在我们手动关闭 Image 和 Button 组件中的 'Raycast Target' & 'Interactable' 复选框之前,所有按钮是否都以这种方式运行?

我想知道 'Ignore Raycast'、'Raycast Target' 和 'Interactable' 这 3 个选项之间的依赖关系。

Interactable 很简单。如果 Graphic Raycaster 在按钮上发现事件(鼠标悬停、单击、鼠标离开等),它是否会对这些事件做出反应?如果 Interactable 为真,那么它会。

其他两个需要一些解释。

图层用于处理与 Unity 的 Physics 光线投射的碰撞。

Ignore Raycast 层与任何其他层一样,但通常会被物理光线投射忽略。 由创建物理光线投射的代码决定 Ignore Raycast 层中对象上的碰撞器是否实际上被忽略。 例如,如果您创建带有遮罩的物理光线投射Physics.IgnoreRaycastLayer,那么它只会与 Ignore Raycast 层中的对象的碰撞体发生碰撞。

但是,同样,该设置涉及物理光线投射

Raycast Target 处理 Unity Graphic Raycaster,这是 Unity 处理与 UI 元素交互的方式(默认)。 Graphic Raycaster 完全独立于 Physics raycast,以及它如何使用图层进行遮罩。 Graphic Raycaster 允许以两种方式控制碰撞,而不是图层。

第一种方法叫做 UI.GraphicRaycaster.BlockingObjects,当光线投射到 2d 对象或 3d 对象时,两者都会停止,或者两者都不会。

第二种方式是 Ignore Raycast 发挥作用的地方。

ui 元素的 Raycast Target 确定与该元素发生碰撞的光线投射是否停止在该元素处,因此它下面的东西也不会与之交互。如果启用了 Raycast Target,那么当您将鼠标悬停在按钮上或单击按钮或其他任何内容时,它会根据配置响应,但 按钮下方的任何内容 不会有那个交互事件。

例如,假设您想要创建一个弹出窗口,可以以一种不会意外点击弹出窗口下方按钮的方式与之交互。在这种情况下,您可能希望在弹出窗口及其按钮等上启用 Raycast Target

长话短说:

  • Interactable 确定按钮是自行启用还是禁用。
  • Raycast Target 确定按钮是否阻止被它覆盖的按钮执行操作。
  • Ignore Raycast 确定 Physics 光线投射是否默认忽略附加到它的碰撞器。