首页 文章

Unity:Raycast没有't Work For The Child Object' s Collider

提问于
浏览
0

我有一个基于平铺的游戏 . 我将塔作为瓷砖的儿童对象 . 我希望能够通过光线投射检测塔上的鼠标点击,而不是瓷砖 . 瓷砖和塔都有2d箱式对撞机 . 我可以检测到瓷砖上的点击,但是光线投射不会检测到塔上的点击 . 我怎么解决这个问题 . 谢谢 .

这是我的光线投射代码:

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的盒子对撞机,但它似乎从来没有撞到过塔楼 .

2 回答

  • 1

    经过一番研究后,似乎一个物体的所有儿童对撞机都被认为属于父母 . 这样你就可以用较小的对撞机构建一个更复杂的对撞机,这种情况通常是需要的 . 仍然可以使用它的transform属性引用精确对撞机,例如:

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

    这将特别指儿童对撞机 .

  • 1

    Unity使用图层系统,您可以过滤掉光线投影使用的图层 . 您可以使用它来击中特定的碰撞器,并避免其他像瓷砖/塔问题 . 语法(适用于2d版本)是:

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

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

    enter image description here

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

    希望有所帮助

相关问题