方法导致OutOfMemory错误

时间:2015-12-25 21:19:15

标签: object recursion unity3d

如果我的游戏中的GameObject具有特殊能力它会触发它,但是我希望这个GameObject所影响的所有特殊游戏对象也触发它们的能力,例如如果炸弹击中某些物体,如果这些物体也是炸弹,也触发它们。我通过调用递归处理所有特殊能力的方法会很容易,但是在编程中,没有多少东西像你在开始时想的那么容易。基本上发生的事情是bullcrap的连锁反应导致Unity显示OurOfMemory错误。同时让我的PC完全冻结,同时礼貌地关闭所有屏幕。

问题是,我怎样才能使它触发所有受影响的多维数据集'特殊能力,没有一切疯狂吗?

代码:

     //Triggers the cube's special ability, if it has any
    private void TriggerSpecialCubeAbility(GameObject specialCube) {
        switch (specialCube.tag) {

            //Destroy all cubes in a radius from the special cube
            case "Bomb":
                TriggerBombAbility(specialCube);
                break;

            //Destroy all cubes of the same color as the special cube
            case "Lighting":
                TriggerLightingAbility(specialCube);
                break;
            default:
                break;
        }
    }

    private void TriggerBombAbility(GameObject specialCube) {
        var nearbyColliders = Physics2D.OverlapCircleAll(specialCube.transform.position, explosionRadius);
        Instantiate(particles[0], specialCube.transform.position, specialCube.transform.rotation);
        Instantiate(particles[1], specialCube.transform.position, specialCube.transform.rotation);

        foreach (var collider in nearbyColliders) {
            if (collider.tag == "Indestructible")
                return;

            var affectedCube = collider.gameObject;
            TriggerSpecialCubeAbility(affectedCube);
            Destroy(affectedCube);
        }

        destroySelectedCubes = true;
        //          Physics2D.gravity *= -1;
        //          Physics.gravity *= -1;
    }

1 个答案:

答案 0 :(得分:1)

无限循环会发生什么。 假设炸弹A靠近炸弹B。

  1. 炸弹爆炸。
  2. 炸弹爆炸触发炸弹B.
  3. 炸弹B爆炸
  4. 炸弹B爆炸触发炸弹A.
  5. 回到1
  6. 您可以通过记住某个对象是否已被触发,然后阻止任何进一步的触发来解决此问题。

    bool thisObjectHasBeenTriggered = false;
    
    //Triggers the cube's special ability, if it has any, AND HAS NOT BEEN TRIGGERED YET
    private void TriggerSpecialCubeAbility(GameObject specialCube)
    {
        if (thisObjectHasBeenTriggered)
            return;
        thisObjectHasBeenTriggered = true;
    
        switch (specialCube.tag)
        {
            // ...
        }
    }