【问题标题】:GameObject selection within bounding area(Seleting gameObject in general direction via transform comparing)边界区域内的游戏对象选择(通过变换比较在大方向上选择游戏对象)
【发布时间】:2017-12-04 08:49:24
【问题描述】:

我想从 BoxCollider 边界内的向量(原点)投射光线/球体,并限制其 maxDistance 以使其不会超出边界区域,并且仅使用 layerMask 命中此边界内的对象。如何做到这一点?

另外,如果我将其投射为 sphereCast 并且多个对象被击中,我怎么能只获得最接近 sphereCast 中心的对象?找了好久,还是没找到。

编辑#1

虽然我感谢您之前的回答,但我更新了此编辑以更好地阐述我真正想要实现的目标。

当我问你最初的问题时,我仍然不清楚如何解决丢失的 rayCast / sphereCast,我不希望它们最终会丢失,具体取决于目标 / sphereCast 半径的大小。

最终目标是通过定向输入来选择游戏对象并且不会错过。我已经有这个边界框在列表中收集游戏对象的变换,如果我输入说游戏手柄模拟棒给出标准化方向,我想选择那个大方向的那个。但是,我知道如果我只在 rayCast / sphereCast 中执行此操作,我必须对每个输入进行多次转换,以确保不会丢失我认为是不必要的代码块的目标。理想的情况是:如果归一化输入 dir: vector2(1,0, 0),则将选择距原点 2 点钟位置的紫色目标。

【问题讨论】:

    标签: unity3d raycasting


    【解决方案1】:

    要获得最接近中心的位置,您可以获取命中碰撞体的变换并循环遍历它们,从中心减去位置。然后选择最小的量级。您可以使用幅度平方来提高性能。

    至于只在盒子碰撞器内拾取东西,一种方法是使用半径等于盒子最大尺寸的球体投射。这也将到达盒子外面,但保证将所有东西都放在盒子里。然后您可以使用传统的碰撞检查手动检查它们是否在盒子碰撞器内。

    【讨论】:

      【解决方案2】:

      1:

      我建议,看看Physics.OverlapBox

      因为它非常适合您的情况:

      查找所有接触或在给定框内的碰撞器。

      您可以将盒子碰撞器的中心和大小作为参数传递,这将返回一个重叠(命中)碰撞器的数组,您可以使用第一个。

      2:

      如果您仍想使用 SphereCast,它会填充 RaycastHit 对象,该对象具有在 collider 属性中命中的第一个对象

      【讨论】:

        【解决方案3】:

        如果您有一个 Collider 作为您的 Bounds,您可以简单地使用 Collider.bounds.extentsCollider.bounds.size 来获取您的对撞机的大小,然后(根据您的起始位置)为您的 Spherecast 设置最大大小。例如。如果您的 SphereCast 从 Cube 的中间开始,您只需使用来自 Collider.bounds.extents 的值之一作为您的最大尺寸。

        第二个问题: Physics.SphereCastAll 将返回 RaycastHits 的数组。它们有一个属性distance,它返回从你的光线投射原点到碰撞体被击中点的距离。您可以简单地遍历数组并使用距离最小的对象来获取最近的对象。

        我还认为Physics.SphereCast 应该返回第一个被击中的对象(因此是最近的对象),如果这就是你想要得到的。但我现在不确定这是否总是像你想要的那样,但它可能值得测试,因为它比使用 Physics.SphereCastAll 方法对你的性能更好。

        【讨论】:

          猜你喜欢
          • 2011-07-28
          • 1970-01-01
          • 1970-01-01
          • 2021-03-10
          • 1970-01-01
          • 1970-01-01
          • 2015-01-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多