使用列表会导致意外行为

问题描述

什么

我正在尝试编写一个系统,其中包括使用列表来管理其他对象可以通过各种方式与之交互的对象。特别是,我正在为2D游戏进行碰撞检测。我的问题是,我划分的系统工作异常,无法识别。我的眼睛已经在关注这个问题了好几个小时了,而且它们越来越疼,所以我在这里寻求支持

说清楚点

这里是问题:在列表中的另一个对象之前无法添加的对象无法与之交互,如果这样做,游戏只会崩溃,并告诉我我无法使用前一个对象所在位置的内存。我可能是错的,但是我对列表的理解使我相信情况并非如此,我应该能够访问列表中任何位置的任何数据,对吗?

与最后添加到列表中的对象进行交互可以很好地进行,没有问题,当稍后将该对象从列表中删除时,可以很好地与先前的对象进行交互,依此类推。

向我们显示详细信息

这里是将对象添加到列表的代码,被称为每一帧,因为列表会清除每一帧以保持其数据最新。

for (var k = 0; k < player.leftEmitter.projectiles.Count; k++) {
    var projectile = player.leftEmitter.projectiles[k];
    var targets = projectile.collider.targets;

    if (!testNPC.disposed) targets.Add(testNPC.collider);
    if (!testNPC2.disposed) targets.Add(testNPC2.collider);
}

for (var l = 0; l < player.rightEmitter.projectiles.Count; L++) {
    var projectile = player.rightEmitter.projectiles[l];
    var targets = projectile.collider.targets;

    if (!testNPC.disposed) targets.Add(testNPC.collider);
    if (!testNPC2.disposed) targets.Add(testNPC2.collider);
}

以下是与对象进行交互时调用代码,也称为每一帧。

for (var i = 0; i < targets.Count; i++) {
    var Box = targets[i];

    if (!Box.parent.disposed) {
        if (colliderRect.GetGlobalBounds().Intersects(Box.colliderRect.GetGlobalBounds()) && !hasEntered) {
            hasEntered = true;
            OnColliderEnter(Box);
        } else if (!colliderRect.GetGlobalBounds().Intersects(Box.colliderRect.GetGlobalBounds()) && hasEntered) {
            hasEntered = false;
            OnColliderExit(Box);
        }
    }
}

解决方法

我找到了解决方案,只需在迭代其OnColliderEnter()函数之前彻底检查目标对撞机是否被处置,即可彻底解决该问题。实际上,这与列表无关,也与我对列表的理解无关。仅仅是因为我没有正确处理垃圾。我感谢C#的垃圾收集器,但有时很难记住要检查到处是否有类似这样的简单内容。