2017-03-02 83 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先生 –