2016-07-04 26 views
0

我試圖使用Physics2D.Raycast來檢查玩家是否在地上(我知道還有其他方法來檢查玩家是否在地面上但我認爲raycast是最可靠的)。 問題在於,在我的場景中,它將球員本身作爲命中,我真的不明白爲什麼以及我該怎麼做。 我的代碼(在PlayerController)如下:Unity Physics2D.Raycast總是返回「調用者」作爲命中

public bool IsGrounded() { 
     Bounds bounds = this.playerCollider.bounds; 
     Vector3 rayOrigin = bounds.center; 
     rayOrigin.y -= bounds.extents.y; 
     RaycastHit2D hit = Physics2D.Raycast (rayOrigin, Vector2.down, 0.1f); 
     if (hit.collider != null) { 
      Debug.Log ("Collider is: " + hit.collider.name); 
     } 
     return hit.collider != null; 
    } 

我可以使用調試鑄造線:

Debug.DrawLine (rayOrigin, new Vector3 (rayOrigin.x, rayOrigin.y - 0.1f, rayOrigin.z), Color.magenta); 

...它被鑄成預期,而Debug.Log始終報告「球員「這本身,我不知道它是如何可能的。那麼,怎麼了?

ps。我正在使用Unity 5.3

回答

3

問題發生是因爲您的播放器在光線投射開始時重疊。有幾種方法可以解決此問題:

。禁用查詢在碰撞開始

轉到編輯 - >項目設置 - >物理2D然後確保查詢開始對撞機不作檢查。更改後,您的代碼運行良好。下面是截圖:

enter image description here

。另一個解決方案是使用layers.Raycasting但忽略了Player layer.Before你這樣做,一定要創建一個名爲Ground層,並把你的遊戲對象地面到Ground圖層,然後創建另一個名爲Player的圖層,並將您的播放器放在Player圖層中。我們現在可以使用bitwise運算符來排除Player圖層中的

enter image description here

現在,讓我們假設玩家層數爲9。下面的代碼應該可以解決你的問題。

public int playerLayer = 9; 
int layerMask = ~(1 << playerLayer); //Exclude layer 9 
RaycastHit2D hit = Physics2D.Raycast(rayOrigin, Vector2.down, 0.1f, layerMask); 

就是這樣。這兩個都能解決你的問題。

對於其他人閱讀,以下是其他方式可以輕鬆檢測到Player在沒有使用Physics2D.Raycast的情況下觸摸地板,還是執行上述所有操作。

只需附加到Player

public class Player : MonoBehaviour 
{ 
    public LayerMask groundLayer; 
    Collider2D playerCollider; 
    bool grounded; 

    void Start() 
    { 
     playerCollider = gameObject.GetComponent<Collider2D>(); 
    } 

    public bool IsGrounded() 
    { 
     grounded = Physics2D.OverlapCircle(playerCollider.transform.position, 1, groundLayer); 
     return grounded; 
    } 
} 

或者您可以使用IsTouchingLayers

public bool IsGrounded() 
{ 
    grounded = grounded = playerCollider.IsTouchingLayers(groundLayer.value); 
    return grounded; 
} 
+0

感謝您的回答!我之前使用IsTouchingLayers()嘗試射線方法,因爲即使玩家在牆上跳躍,IsTouchingLayers()也會返回true(相反,偵測應該只發生在玩家精靈的底部,這就是爲什麼我選擇了raycast)試試重疊Circle(),但我擔心它可能會產生相同的不希望的效果:P無論如何,我不明白爲什麼默認情況下,raycast應該從對撞機本身開始......在對象內繪製光線有什麼意義? – daveoncode

+0

我相信你也可以使用'Physics2D.RaycastAll'。結果按距離排序(儘管我不知道是上升還是下降)。 –

+0

@GunnarB。是的你可以。我只用少量內存分配來發布少量解決方案。我的意思是,爲什麼分配內存與陣列,而你可以做光線播放和排除一些圖層?場景中的GameObject越多,'Physics2D.RaycastAll'分配的內存就越多。 – Programmer

-1

Vector2.down矢量並不總是呈現對象空間的向下矢量。您可以使用-transform.up。另外,如果可以接受,你可以添加一些填充到光線的起始點,如rayOrigin.y += 0.0001f;

+0

transform.down ?!你確定?它似乎並不存在:/ – daveoncode

+0

他的意思是Vector2.down – Programmer

+0

但它是我已經使用的! :D – daveoncode

相關問題