2015-04-23 2 views
1

Я делаю бесконечную дорогу. Я использую пул объектов для дорог и объектов противника. дороги работают хорошо, но у меня проблема с объектами противника, я могу добавить врага из пула, но я не могу вернуть обратно вражеские объекты в пул. Log GameОбратный объект для бассейна

public void CreateEnemy(EnemyPool pool, int roadLenght, Vector3 startPos , int numberOfEnemies, int enemyType) 
    { 
     enemy = new Transform[numberOfEnemies]; 
     enemyIndex = new int[numberOfEnemies]; 

     currentRoadLenght = roadLenght; 
     //I add enemies along the length of the path. Path Lenght is randomly generated. 
     currentEnemyNumber = numberOfEnemies; 

     int arrayedEnemyObject = 0; 

     for(int i = 0; i < roadLenght; i++) 
     { 
      Vector3 pos = startPos + new Vector3(0, 1, i * 15); 

      for(int j = 0; j < numberOfEnemies; j++) 
      { 
       Transform obj = pool.PullEnemyFromPool(enemyType); 
       obj.position = pos; 
       obj.gameObject.SetActive(true); 

       enemy[j] = obj; 
       enemyIndex[j] = enemyType; 
       Debug.Log(j); 

       pos.z += 3; 
       arrayedEnemyObject++; 
      } 

      if(arrayedEnemyObject == numberOfEnemies) 
      { 
       arrayedEnemyObject = 0; 
       i += enemyObjectDistance; 
      } 
     } 
    } 

    public void DestroyEnemy(EnemyPool objectPooler) 
    { 
     if (enemy != null) 
     { 
      int destroyedObj = 0; 

      for(int i = 0; i < currentRoadLenght; i++) 
      { 
       for(int j = 0; j < currentEnemyNumber; j++) 
       { 
        Transform obj = enemy[j]; 
        obj.gameObject.SetActive(false); 
        objectPooler.AddEnemyToPool(enemyIndex[j], obj); 

        destroyedObj++; 
       } 

       if(destroyedObj == currentEnemyNumber) 
       { 
        destroyedObj = 0; 
        i += enemyObjectDistance; 
       } 
      } 

      enemy = null; 
     } 
    } 

Мои EnemyPoolScript

public class EnemyPool : MonoBehaviour 
{ 
    private GameObject[] enemyObjects; 
    private List<Transform>[] enemyObjectsPool; 

    public void FillPool(GameObject[] enemyObjects , int size) 
    { 
     this.enemyObjects = enemyObjects; 

     Vector3 pos = Vector3.zero; 
     Quaternion tilt = Quaternion.identity; 
     GameObject obj; 

     enemyObjectsPool = new List<Transform>[enemyObjects.Length]; 

     for (int i = 0; i < enemyObjects.Length; i++) 
     { 
      enemyObjectsPool[i] = new List<Transform>(); 

      for(int j = 0; j < size; j++) 
      { 
       obj = Instantiate(enemyObjects[i], pos, tilt) as GameObject; 
       obj.SetActive(false); 
       enemyObjectsPool[i].Add(obj.transform); 
      } 
     } 
    } 

    public void AddEnemyToPool(int index, Transform obj) 
    { 
     enemyObjectsPool[index].Add (obj); 
    } 

    public Transform PullEnemyFromPool(int index) 
    { 
     Transform obj; 

     if(enemyObjectsPool[index].Count <= 0) 
     { 
      obj = (Instantiate(enemyObjects[index], Vector3.zero, Quaternion.identity) as GameObject).transform; 
     } 
     else 
     { 
      obj = enemyObjectsPool[index][0]; 
      enemyObjectsPool[index].RemoveAt (0); 
     } 

     return obj; 
    } 

} 
+0

Что такое проблема? Вы получаете исключение? –

+0

Нет, объекты не могут быть уничтожены. –

ответ

3

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

for (int i = 0; i < roadCount; i++) 
    enemy[j] = pullObject; 

Наружный контур, вероятно, является виновником.

Кроме того, в вашем пуле может помочь использовать очередь вместо списка. Очереди специально используется для удаления элементов с фронта, который будет более эффективным, чем RemoveAt(0)

Edit:

хорошо ... это немного трудно объяснить, но ваш outerloop, вероятно, не делать то, что вы думаете, что это так. все ваши внешние петли делают, чтобы убедиться, что вы повторяете количество циклов внутри цикла. позволяет делать вид, у вас есть длина дороги из 3, и количество врагов 2.

Это то, что делает ваша программа:

pos = startPos + new Vector3(0,1,0); 
obj.position = pos; 
enemy[0] = obj; 
pos.z += 3; 
arrayedEnemeyObject++; 
obj.position = pos; 
enemy[1] = obj; 
pos.z += 3; 
arrayedEnemeyObject++; 
arrayedEnemeyObject = 0; 
i += enemyObjectDistance; 
pos = startPos + new Vector3(0,1,15); 
obj.position = pos; 
enemy[0] = obj; 
pos.z += 3; 
arrayedEnemeyObject++; 
obj.position = pos; 
enemy[1] = obj; 
pos.z += 3; 

Обратите внимание, как враг [0] получает в два раза установлен. я до сих пор не знаю, что должно делать дорога, потому что ваш наружный кружок ничего не делает. Я ... предполагаю, это то, что вы хотите ... но я действительно не знаю

enemy[,] = new Transform[roadCount, numberOfEnemies]; 
enemyIndex[,] = new int[roadCount, numberOfEnemies]; 

затем во внутреннем цикле:

enemy[i,j] = obj; 
+0

Я отредактировал мое сообщение. –

+0

Я отредактировал мой ответ – Psymunn

+0

Новая ошибка, все объекты уничтожаются. Я хочу уничтожить врагов на той дороге, которую я прошел. –

Смежные вопросы