2015-12-25 3 views
0

Если у GameObject в моей игре есть особые возможности, она вызывает его, но я хочу, чтобы все специальные объекты GameObject, которые этот GameObject затрагивает, также запускают свои способности, например, если бомба поражает некоторые объекты, если эти объекты также являются бомбами, вызывают их также. Хотя это было бы легко, вызвав метод, который рекурсивно обрабатывает все специальные способности, но в программировании не так много всего проще, чем вы думали в начале. В основном, что произошло, это цепная реакция bullcrap, которая заставила Unity показать ошибку OurOfMemory. Кроме того, мой компьютер полностью замораживается, вежливо отключая все экраны.Метод вызывает ошибку OutOfMemory

Вопрос в том, как я могу это сделать, чтобы он вызывал все особые способности затронутых кубов, без всякого сгустка?

Код:

 //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; 
    } 
+0

Если поблизости находятся два кубика бомбы, не закончится ли это переполнением стека? Первый запускает второй, второй запускает первый раз и т. Д.? –

ответ

1

Что происходит бесконечный цикл. Предположим, что бомба находится под бомбой B.

  1. Бомба взрывается.
  2. бомба Взрыв запускает бомбу B.
  3. бомбы B взрывает
  4. бомбы B взрыв запускает бомбу А.
  5. вернуться к 1

Вы можете просто решить эту проблему, запоминая, если объект имеет уже запущен, а затем предотвращает дальнейший запуск.

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) 
    { 
     // ... 
    } 
} 
Смежные вопросы