簡體   English   中英

Unity Physics2D.Raycast擊中了自己

[英]Unity Physics2D.Raycast hits itself

我正在嘗試使用Physics2D.Raycast來檢查玩家是否在地上(我知道還有其他方法可以檢查玩家是否在地面上,但我認為光線投射是最可靠的)。 問題是在我的場景中它將玩家本身作為命中返回,我真的不明白為什么以及我該怎么做。 我的代碼(在PlayerController )如下:

 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始終報告“Player”本身,我不知道它是如何可能的。 那有什么不對?

PS。 我正在使用Unity 5.3

問題出現是因為您的播放器在光線投射開始時重疊。 有幾種方法可以解決這個問題:

1個 .Disable 查詢開始對撞機

轉到編輯 - > 項目設置 - > 物理2D,然后確保未選中查詢在碰撞器中啟動 更改后,您的代碼運行正常。 這是一個截圖:

在此輸入圖像描述

2.另一個解決方案是使用layers.Raycasting但忽略Player層。在你這樣做之前,確保創建一個名為Ground的圖層並將你的地面GameObject放到Ground圖層然后創建另一個名為Player的圖層並將你的玩家放入Player層。 我們現在可以使用bitwise符從光線投射中排除 Player層。

在此輸入圖像描述

現在,我們假設Player層數為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;
}

Vector2.down向量不會始終顯示對象空間的向下向量。 您可以使用-transform.up

另外,如果可以接受,你可以在光線的起始點添加一些填充,如rayOrigin.y += 0.0001f;

暫無
暫無

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

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