Я считаю, что проблема в том, что вы добавляете ссылку на массив collisionPair
к вашему broadPhaseCollisionList
на каждой итерации (вы добавляете одну и ту же ссылку снова и снова). Между тем, элементы collisionPair
обновляются с последним столкновением на каждой итерации.
В конце вашего цикла collisionPair
содержит последнюю пару коллизий, а broadPhaseCollisionList
содержит элементы [collisionCount], указывающие на один и тот же массив.
Чтобы исправить это, вы должны установить collisionPair
в новый массив каждый раз перед добавлением его в свой список:
if (observerBox != observedBox && TestAABBOverlap(observerBox.aabb, observedBox.aabb))
{
observerBox.colliding = true;
observedBox.colliding = true;
broadPhaseCollisionList.Add(new[] {observedBox, observerBox});