2014-02-08 6 views
1

Я работаю в Unity3D, C# специально, и я пытаюсь написать цикл For, который создает несколько игровых объектов в 1 цикле, но я хочу немного пошатнуть их экземпляр, скажем, 0,5 секунд, прежде чем будет создан экземпляр следующего игрового объекта.Unity3d - Coroutine in for Loop

Я полагал, что это будет так просто, как делать нормальный цикл:

for (int i = 0; i <= 3; i++) 
      { 
       Instantiate(gameObject, objectSpawn[i].transform.position, Quaternion.identity); 
       StartCoroutine(WeaponsCooldown(6)); 
      } 
      StartCoroutine(WeaponsCooldown(2)); 

и в моем couroutine я иметь дело выключатель, так что я могу использовать его несколько раз (кажется, несколько жестких точек на корабле или что-то)

IEnumerator WeaponsCooldown(int coolTrigger) 
{ 
    switch (coolTrigger) 
    { 
    case 1: 
     mainFire = true; 
     yield return new WaitForSeconds(5); 
     mainFire = false; 
     break; 

    case 2: 
     leftFire = true; 
     yield return new WaitForSeconds(3); 
     leftFire = false; 
     break; 
...down to case 6 (for this project) 

результаты, которые я получаю таким образом: StartCoroutine, что находится вне для петлевых пожаров просто отлично - это мастер восстановления для этого оружия и удерживает игрока от спама обжиг. Однако startcoroutine внутри цикла for, похоже, не замедляет цикл for any, и я так новичок в сценариях Unity3D и C#. Я не совсем уверен, как это сделать.

Я предполагаю, что StartCoroutine представляет собой отдельный поток, который проходит в стороне от потока Update, и поэтому цикл For продолжается, потому что он не ждет завершения сопрограммы.

Если это так, то будет кто-нибудь есть какие-либо идеи (кроме ввода отдельных сценариев на каждую жесткой точку игрока и настроек ошеломляющего времени запуска (или объект игры экземпляр задержки) на каждом из них?

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

Благодарим вас за любую информацию, предлагаемую заранее, Nick Willcox

ответ

3

Однако startcoroutine внутри для цикла, кажется, не замедлит для цикла

Нет, это не так. Результат вашего скрипта - создать экземпляр всех GameObject в том же фрейме, а также запустить все ваши сопрограммы (у которых есть другой кулдаун, продолжающийся в разное время).

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

Нет :). Coroutines живет в одной и той же теме. Они всего лишь iterator blocks. Citing Jon тарелочки:

В C# 2, компилятор делает всю тяжелую работу за вас, когда вы используете блоков итераторов для реализации либо IEnumerable или IEnumerator (или родовых форм). Он создает для вас конечный автомат, и итератор эффективно выполняет код внутри блока итератора, дает значения по мере их поступления.

Я думаю, что другой способ описать их - это совместная многозадачность.

Я пытаюсь написать цикл, который создает несколько игровых объектов в 1 петлю, но я хочу лишь слегка шатаясь их Instantiate, скажем 0,5 секунды, до следующего объекта игра конкретизируется.

без учета конкретного поведения вы реализуете, простой способ задержать Instantiate вызовов (0,5 с) оборачивает для цикла в сопрограммное это сам:

public IEnumerator DelayInstantiate() 
{ 
    for (int i = 0; i <= 3; i++) 
    { 
    Instantiate(gameObject, objectSpawn[i].transform.position, Quaternion.identity); 
    StartCoroutine(WeaponsCooldown(6)); //or do what you want 

    yield return new WaitForSeconds(0.5f); 
    } 
} 
+0

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

+0

Маркировка как полная/лучший ответ. Он полностью работает !!! Woo! Спасибо большое! Я боролся с этим уже несколько дней. ><. lol Большое спасибо Heisenbug. –