[英]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.