【问题标题】:How do I prevent certain objects from receiving the raycast?如何防止某些对象接收到光线投射?
【发布时间】:2020-02-08 19:51:27
【问题描述】:

我正在使用以下代码执行光线投射并检测被击中的游戏对象:

var eventDataCurrentPosition = new PointerEventData(EventSystem.current);
eventDataCurrentPosition.position = screenPosition;
var results = new List<RaycastResult>();
EventSystem.current.RaycastAll(eventDataCurrentPosition, results);

但是,我只希望EventSystem.current.RaycastAll 击中某些对象。有什么方法可以只允许某些 GameObjects 接收光线投射?

【问题讨论】:

  • 看起来您只是在 UI 上进行光线投射...这是您的意图吗?您可以添加一个命中掩码,使光线仅与属于您选择的图层的对象发生碰撞(但上面的代码对此不起作用,因此询问您是否只想为 UI 执行此操作)。
  • 是的..我只想点击可用的按钮
  • 你想对光线投射的结果做什么?如果您的意图是驱动菜单/游戏,那么您可能应该在 Inspector 中显示的每个按钮上使用 Click() 函数。
  • 我想得到一个用户已经注视了那个特定按钮的回调。这是一个 VR 应用程序
  • 为什么要防止循环?

标签: c# unity3d virtual-reality raycasting


【解决方案1】:

两种方式,一种是您可以将每个 UI 类别分离到不同的画布上,并在每次您的需求发生变化时从不同的 graphicsRaycaster 组件中投射光线。

或者,我认为 graphicsRaycaster 和 EventSystem.current.RaycastAl 都返回一个包含所有命中的 UI 对象的数组,所以为什么不根据它们的标签通过脚本手动过滤掉。

【讨论】:

    【解决方案2】:

    您可以尝试将 CanvasGroup 组件添加到您不想被光线投射击中的 UI 元素中。 CanvasGroup 具有“阻止光线投射”选项。只需将其设置为 false,它就可以完成这项工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-05
      • 2019-07-18
      相关资源
      最近更新 更多