Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Unity:Raycast不';t击中子对象';s对撞机_C#_Unity3d - Fatal编程技术网

C# Unity:Raycast不';t击中子对象';s对撞机

C# Unity:Raycast不';t击中子对象';s对撞机,c#,unity3d,C#,Unity3d,我有一个基于瓷砖的游戏。我将塔放置为瓷砖的子对象。我希望能够通过光线投射检测到鼠标在塔上的点击,而不是瓷砖上的点击。瓷砖和塔楼都有2d长方体碰撞器。我可以检测到瓷砖上的咔嗒声,但raycast无法检测到塔楼上的咔嗒声。我怎样才能解决这个问题。谢谢 以下是我的光线投射代码: if (Input.GetMouseButtonDown(0)) { Ray ray = camera.ScreenPointToRay(Input.mousePosition);

我有一个基于瓷砖的游戏。我将塔放置为瓷砖的子对象。我希望能够通过光线投射检测到鼠标在塔上的点击,而不是瓷砖上的点击。瓷砖和塔楼都有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框对撞机,但光线似乎从未击中塔楼。

我建议使用3d光线而不是2d光线。也许相机,屏幕指针,也许会在手上。另外,我建议您先阅读以下内容:

只是钓鱼,但您的子碰撞器不可能隐藏在父碰撞器中吗?然后,Raycast将只返回第一次命中。您可以尝试
RaycastAll
,如下所述:


并在控制台中循环所有点击,以了解您是否真正获得了碰撞器。

只需限制特定层的光线投射

//get the mask to raycast against either the player or enemy layer
 int layer_mask = LayerMask.GetMask("Player", "Enemy");
 //or this would be just player
 //int layer_mask = LayerMask.GetMask("Player");

 //or this would be player, enemy or cows!
 //int layer_mask = LayerMask.GetMask("Player","Enemy","Cows");

 //do the raycast specifying the mask
 if (Physics.Raycast (ray, out hit, distance, layer_mask))
 {

 } 

您要检测的子对象是哪一层?单击?它位于第9层@Programmer