2016-05-25 2 views
1

Я пытаюсь понять пул объектов. Я могу заставить сценарий вытащить один объект за раз, но мне нужно иметь возможность вытащить три или более из списка одновременно.Как использовать два объекта из объединенного списка в одном скрипте?

Мой сценарий объединения объектов большой, поэтому я действительно не хочу делиться всем этим, если это не необходимо.

мне нужно, чтобы иметь возможность изменить расположение порождения пламени, так что я создал скрипт, чтобы сделать это:

private void CreateWavesForFlames(GameObject flame, float xBase, float xDisplacement, float dropHeight) 
{ 
    flame.transform.position = new Vector3(xBase + xDisplacement, dropHeight, 0); 
    flame.SetActive(true); //this turn the pooled object on 
} 

Так что мне нужно, чтобы породить три пламени, в то же время и изменить их икру местах

волна вызов будет выглядеть примерно так:

void Wave1() { 
    Debug.Log("Wave1"); 
    tempGOHolder = gm.GetLargeFire(); 


    CreateWavesForFlames(tempGOHolder, 0, 0, 12); 
    CreateWavesForFlames(tempGOHolder, 10, 0, 12); 
    CreateWavesForFlames(tempGOHolder, 15, 0, 12); 

} 

что происходит только создается один огонь пламя, и он использует последние CreatWavesForFlames. Мне нужно, чтобы трое были разными.

Любые предложения о том, как это сделать, были бы замечательными.

ответ

1

Хорошо .. это то, что ожидается от вашего кода. если вы хотите 3 различных объектов пламени, тогда вы будете иметь, чтобы сделать это (предполагая, что «г» Ваш бассейн менеджер объекта):

tempGOHolder = gm.GetLargeFire(); 
CreateWavesForFlames(tempGOHolder, 0, 0, 12); 

tempGOHolder = gm.GetLargeFire(); 
CreateWavesForFlames(tempGOHolder, 10, 0, 12); 

tempGOHolder = gm.GetLargeFire(); 
CreateWavesForFlames(tempGOHolder, 15, 0, 12); 
+0

Awesome. Такое простое решение. Я не думал, что могу повториться, но, видимо, могу! Спасибо. –

+0

Вы также можете расширить свой 'GetLargeFire()', чтобы возвращать массив GameObjects и перебирать Array вместо повторения этих строк n раз – TheDjentleman

+0

Мне придется это выяснить. Спасибо за предложение. –

2

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

Допустит, что ваша GetLargeFire() функции в сценарии бассейна выглядит следующим образом:

GameObject GetLargeFire() 
{ 
    return availableGameObject; 
} 

Вы можете создать перегрузку функции GetLargeFire(), занимающей массив, который передается ему. Я бы не рекомендовал возвращать массив, потому что он выделяет память, поэтому делает ваш пул сценария бесполезным. Заполнение массива, которое передается, лучше.

public void GetLargeFire(GameObject[] gOBJ, int amountToReturn) 
{ 
    for (int i = 0; i < gOBJ.Length; i++) 
    { 
     if (i < amountToReturn) 
     { 
      gOBJ[i] = GetLargeFire(); 
     } 
     else 
     { 
      //Fill the rest with null to override what was inside of it previously 
      gOBJ[i] = null; 
     } 
    } 
} 

Теперь, чтобы использовать его как пример, у вас есть в вашем вопросе, вы должны объявить tempGOHolder как массив и выбрать номер, по вашему мнению, достаточно для этого. В этом примере мы будем использовать .

GameObject[] tempGOHolder; 

void Start() 
{ 
    tempGOHolder = new GameObject[3]; 
} 

void Wave1() { 
    Debug.Log("Wave1"); 
    gm.GetLargeFire(tempGOHolder, 3); 
    CreateWavesForFlames(tempGOHolder[0], 0, 0, 12); 
    CreateWavesForFlames(tempGOHolder[1], 10, 0, 12); 
    CreateWavesForFlames(tempGOHolder[2], 15, 0, 12); 
} 

Вы можете даже использовать цикл, чтобы создать волны с CreateWavesForFlames с меньшим количеством кода.

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