2017-04-03 13 views
1

當我將Unity版本5.5更新到5.6時,發生了有關Collision2D.contacts數組的錯誤。當我嘗試訪問聯繫人數組時,我現在無法獲取聯繫人信息。Unity5.6 Collision2D接觸點數組索引超出範圍錯誤

void OnCollisionExit2D(Collision2D col) 
    { 
    if (col.gameObject.CompareTag("Ground")) 
    { 
      if ((_transform.position.y - col.contacts[0].point.y) > colliderHeight/2 + .15f) 
      { 
       Debug.Log ("Contact count = " + col.contacts.Length); 
       _onGround = false; 
       ParticleController.PlayDustEffect(); 
      } 

     } 
    } 

錯誤日誌:

IndexOutOfRangeException:數組索引超出範圍。 Player.OnCollisionExit2D(UnityEngine.Collision2D COL)(在資產/腳本/ CharacterController/Player.cs:759)

我如何修正這個錯誤?

謝謝你的時間。

回答

0

對於那些尋找ArrayIndexOutOfRange錯誤,同時試圖訪問一個Collision2D的ContactPoint2D,似乎API現在:

collision.getContacts(myContacts)

,你初始化並傳遞一個空數組myContacts。有關Collision2D.contacts的文檔,請參閱關於此的更多信息:

與傳入的Collider2D的具體接觸點。你應該避免使用它,因爲它會產生內存垃圾。改爲使用 GetContacts

1

似乎在Unity 5.6中不再計算碰撞的出口點。 Some changes關於碰撞檢測已在此版本已經改變:

物理:內部2D接觸處理已經完全重寫,提供聯繫人的更強大和可靠的報告。

我想它的邏輯如下:爲什麼會有一個接觸點,如果兩個對撞機不再相互接觸?由於沒有聯繫點,col.contacts在此處爲空。所以當你試圖訪問col.contacts [0]時,元素不存在,觸發IndexOutOfRangeException。

Collision.contacts documentation(不是Collision2D.contacts一個,但我想的行爲是一樣的):

每個聯繫人包含接觸點,正常和兩個對撞機是相撞(見ContactPoint)。從內部OnCollisionStayOnCollisionEnter您可以始終確保聯繫人至少有一個元素。

所以OnCollisionExit在任何情況下都不能保證在col.contacts中至少存在一個點。

+0

感謝您的建議和時間,但這裏有一個問題。您可以訪問上次檢測到的碰撞信息。 https://docs.unity3d.com/ScriptReference/MonoBehaviour.OnCollisionExit.html - 在將Unity 5.5更新到5.6後,當我使用OnCollisionExit2D函數時,無法獲取任何聯繫人信息。如果我無法解決這個問題,我將安裝Unity 5.5。 –

+0

這發生在OnCollisionEnter2D上。如何在沒有接觸點的情況下發生碰撞? –