簡體   English   中英

Unity:Raycast不適用於子對象的對撞機

[英]Unity: Raycast Doesn't Work For The Child Object's Collider

我有一個基於圖塊的游戲。 我將塔放置為瓷磚的子對象。 我希望能夠通過光線投射來檢測鼠標在塔樓而非瓷磚上的點擊。 瓷磚和塔樓都具有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盒子對撞機,但光線似乎從未照射過塔。

Unity使用圖層系統,您可以過濾掉射線廣播正在使用的圖層。 您可以使用它來擊中特定的對撞機,並避免其他問題,例如瓷磚/塔樓問題。 語法(對於2d版本)為:

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

在這里,您可以看到layermask參數選擇與父對象所在的圖層不同的圖層。 然后使用檢查器中的下拉菜單將孩子放在不同的圖層上,如下所示。

在此處輸入圖片說明

您可以分別設置父級和子級游戲對象的層。

希望能有所幫助

經過一些研究,似乎將對象的所有子碰撞對象都視為父對象。 這樣,您就可以在較小的對撞機基礎上建立更復雜的對撞機,而這種情況通常是需要的。 仍然可以使用其transform屬性來引用確切的對撞機,例如:

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

這將專門針對兒童對撞機。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM