当我将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)
如何解决错误?
感谢您的时间。
答案 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。