2017-03-02 79 views
0

我有一个基于平铺的游戏。我把塔作为瓷砖的子对象。我希望能够通过光线投射来检测塔上的鼠标点击,但不能检测到瓦片。瓷砖和塔都有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箱对撞机。

+1

可以显示有问题的对撞机的属性的屏幕截图吗?这个光线投射是否有所作为?更多细节将有助于将问题缩小到可回答的状态。 – Serlite

+0

你可以检查瓷砖的碰撞和发现瓷砖是否有孩子然后控制它... [https://docs.unity3d.com/ScriptReference/Transform.GetChild.html](https://docs.unity3d.com/ ScriptReference/Transform.GetChild.html) –

+0

请查询实际问题。尝试描述问题,尽可能地编辑该问题 –

回答

1

了一些研究之后,它似乎对象的所有子对撞机被认为属于母公司。这样你就可以建立一个更小的复杂对撞机,这种情况通常是需要的。确切的对撞机可以仍然使用它的变换属性被引用,例如:

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

这将把孩子的具体撞机。

+0

这工作很完美。还有一个问题。当我在鼠标位置投射光线时,鼠标位于游戏视图之外时,会出现空引用错误。在行* if(hit.collider.transform!= null)*。为什么在我实际检查它是否为空时发生这种情况? –

+0

好吧,这将检查我们可能不一定具有的对象的属性。因此,首先检查对象是否为空,然后检查对象的属性是否为空(检查hit.collider,然后检查hit.collider.transform)。只要首先检查层次结构中的最高层,就可以在相同的if语句中执行此操作。 –

+0

我希望这是有道理的,但如果不是,将会重新说明。 –

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

您可以设置家长的层和孩子分开gameobjects。

希望帮助

+0

这将解决它,但如果你可以发布一些代码,但社区可以帮助消除你的具体问题。 –

+0

谢谢。我编辑了这个问题,抱歉在我太累之前没有提供代码。事情是,我把塔作为瓷砖的孩子,但光线不会击中塔。当我掩饰瓷砖时,我什么也得不到。 –

+0

现在可以检查吗? @Bigglesworth先生 –