【问题标题】:Unity: Raycast Doesn't Work For The Child Object's ColliderUnity:Raycast 不适用于子对象的碰撞器
【发布时间】:2017-03-07 18:04:16
【问题描述】:

我有一个基于图块的游戏。我将塔放置为瓷砖的子对象。我希望能够通过光线投射检测塔楼而不是瓷砖上的鼠标点击。瓷砖和塔楼都有 2d 盒对撞机。我可以检测到瓷砖上的点击,但 raycast 不会检测到塔上的点击。我怎么解决这个问题。谢谢。

这是我的光线投射代码:

if (Input.GetMouseButtonDown(0))
        {
            Ray ray = camera.ScreenPointToRay(Input.mousePosition);

            ray.origin = camera.transform.position;

            RaycastHit2D hit = Physics2D.Raycast(camera.transform.position, -Vector2.up, 50, 8);

            if (hit.collider != null && !EventSystem.current.IsPointerOverGameObject())
            {
                Debug.Log(hit.collider.transform.tag);
                //Transform objectHit = hit.transform;

            }
        }
    }

当我掩盖瓷砖(这里是第 8 层)时,我什么也得不到。尽管塔(如瓷砖)也有一个 2d 盒对撞机,但似乎光线从未击中塔。

【问题讨论】:

  • 你能显示有问题的对撞机的属性截图吗?光线投射是否击中任何东西?更多细节将有助于将问题缩小到可回答的状态。
  • 你可以检查瓷砖的对撞机,看看瓷砖是否有孩子然后控制它...https://docs.unity3d.com/ScriptReference/Transform.GetChild.html
  • 请提出实际问题。尽量描述问题
  • 我编辑了这个问题。你现在可以看看吗? @Serlite

标签: c# unity3d


【解决方案1】:

经过一番研究,似乎一个对象的所有子对撞机都被认为属于父级。这样您就可以从较小的对撞机中构建出更复杂的对撞机,而这种情况通常是需要的。仍然可以使用它的 transform 属性来引用确切的对撞机,例如:

if (hit.collider.transform != null)
{
   //Execute code
}

这将专门指儿童对撞机。

【讨论】:

  • 这很完美。再问一个问题。当我在鼠标位置投射光线时,当鼠标位于游戏视图之外时,出现空引用错误。在行 * if (hit.collider.transform != null) *.为什么在我实际检查它是否为空时会发生这种情况?
  • 嗯,这检查了我们可能不一定拥有的对象的属性。所以首先检查对象是否为空,然后检查对象的属性是否为空(检查hit.collider,然后检查hit.collider.transform)。只要首先检查层次结构中的最高层,您就可以在相同的 if 语句中执行此操作。
  • 我希望这是有道理的,但如果没有,我会改写。
  • 谢谢先生!您帮助我解决了项目中的主要问题!
  • 没问题,我很高兴听到您的工作正常!希望项目的其余部分进展顺利。
【解决方案2】:

Unity 使用图层系统,您可以过滤掉光线投射正在使用的图层。您可以使用它来击中特定的对撞机并避免其他类似您的瓷砖/塔的问题。语法(对于 2d 版本)是:

RaycastHit2D Raycast(Vector2 origin, Vector2 direction, float distance
= Mathf.Infinity, int layerMask = DefaultRaycastLayers, float minDepth
= -Mathf.Infinity, float maxDepth = Mathf.Infinity);

在这里,您可以看到 layermask 参数选择与您的父对象所在的图层不同的图层。然后使用检查器中的下拉菜单将孩子放置在不同的图层上,如下所示。

您可以分别设置父游戏对象和子游戏对象的图层。

希望有帮助

【讨论】:

  • 这会解决它,但如果你可以发布一些代码,但是社区可以帮助解决你的具体问题。
  • 谢谢。我编辑了这个问题,很抱歉在我太累之前没有提供代码。问题是,我将塔放置为瓦片的子代,但射线从不击中塔。当我掩盖瓷砖时,我什么也得不到。
  • 现在可以查看了吗? @Mr.Bigglesworth
  • 我对我的答案进行了一些编辑,只是想确保您在检查器中设置瓷砖和塔的图层并且它们是不同的。
  • 我实际上解决了检查父对象是否有子对象的问题。显然,ray 只会击中父级的对撞机。如果父对象具有特定类型的子对象(使用标签),代码将采取适当的行动。在我的情况下,它似乎与图层无关。但是射线不击中子对象的对撞机是我的想法。你怎么看待这件事? @Mr.Bigglesworth
猜你喜欢
  • 1970-01-01
  • 2015-12-04
  • 2021-11-03
  • 2023-03-03
  • 1970-01-01
  • 2022-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多