Unity5.6 Collision2D接触点数组索引超出范围错误

时间:2017-04-03 11:21:25

标签: unity3d

当我将Unity版本5.5更新为5.6时,Collision2D.contacts数组发生错误。当我尝试访问联系人数组时,我现在无法获得联系人信息。

    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)(在Assets / Scripts / CharacterController / Player.cs:759)

如何解决错误?

感谢您的时间。

2 个答案:

答案 0 :(得分:1)

似乎在Unity 5.6中不再计算碰撞的出口点。关于碰撞检测的Some changes在此版本中已更改:

  

物理:内部的二维联系处理已经完全重写,可以提供更健壮,更可靠的联系人报告。

我猜它的逻辑如下:如果两个碰撞器不再相互碰撞,为什么会有一个接触点?由于没有联系点,col.contacts在那里是空的。因此,当您尝试访问col.contacts [0]时,该元素不存在,从而触发IndexOutOfRangeException。

来自Collision.contacts documentation(不是Collision2D.contacts one,但我认为行为是相同的):

  

每个联系人都包含一个接触点,正常和碰撞的两个碰撞器(请参阅ContactPoint)。从 OnCollisionStay OnCollisionEnter 内部,您始终可以确保联系人至少有一个元素。

因此OnCollisionExit在任何情况下都不保证col.contacts中至少存在一个点。

答案 1 :(得分:0)

对于那些在尝试访问Collision2D上的ContactPoint2D时搜索ArrayIndexOutOfRange错误的人来说,似乎API现在是:

collision.getContacts(myContacts)

初始化并传入一个空数组myContacts。有关Collision2D.contacts的文档中有关详细信息,请参阅:

  

与传入的Collider2D的特定接触点。您   应避免使用它,因为它会产生内存垃圾。使用   而是GetContacts