2016-03-04 3 views
1

Я пытался создать «систему событий» для проекта, над которым я работаю. Вот как я это делаю: я заполняю список ссылкой на объект gameObject и функции, которые мне нужно выполнить из этого объекта gameObject. Затем, когда запускается «событие» (в этом случае, когда игрок переходит в коллайдер триггера), я просто перебираю список и вызываю функции внутри него.Unity/C#: Как выполнить функцию после того, как другая функция завершила выполнение?

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

Я читал много документации как Unity, так и C# о сопроводителях и делегатах, но я не могу, по-видимому, обманывать все эти вещи и найти способ реализовать их по коду. Так что я вам нужна ваша помощь: как я могу это достичь?

+0

Вы могли бы поделиться своим кодом (например, где вы пытаетесь выполнить функции в порядке)? Знаете ли вы, как долго каждая функция будет выполнена? В этом случае вы можете просто компенсировать время задержки 'Invoke()'. (Это было бы более применимо в случае кинематографии, где стимуляция должна, вероятно, основываться на времени.) – Serlite

+0

Обновлено с помощью кода @Serlite –

ответ

3

1) использовать Invoke

private void BeginRace() 
{ 
Invoke("WaveFlag", 0.5f); 
Invoke("Beeps", 1.5f); 
Invoke("CrowdBeginsCheer", 2f); 
Invoke("CarsStartMoving", 2.2f); 
} 

2) использовать сопрограммная

private void BeginRace() 
{ 
StartCoroutine(RaceSequence()); 
} 

private IEnumerator RaceSequence() 
{ 
yield return new WaitForSeconds(.5f); 
WaveFlag(); 
yield return new WaitForSeconds(1f); 
Beeps(); 
yield return new WaitForSeconds(.5f); 
CrowBeginsCheer(); 
yield return new WaitForSeconds(.2f); 
CarsStartMoving(); 
} 

Вы должны освоить оба сопрограмм и Invoke. Обязательно просто используйте Invoke, когда это возможно. Избегайте сопрограмм, когда вы просто изучаете Unity. (Advanced essay сопрограмм.)

3) «Мне нужно ждать, пока предыдущая функция не закончилась перед выполнением следующего один»

а) Каждая из этих функций должны быть IEnumerator

private IEnumerator ExplodeCar() 
{ 
.. 
} 

private IEnumerator CrowdReaction() 
{ 
.. 
} 

private IEnumerator WinningCelebration() 
{ 
.. 
} 

б) называть их один за другим, ожидая, чтобы закончить каждый

private void Sequence() 
{ 
StartCoroutine(Seq()) 
} 

private IEnumerator Seq() 
{ 
yield return StartCoroutine(ExplodeCar()); 
yield return StartCoroutine(CrowdReaction()); 
yield return StartCoroutine(WinningCelebration()); 
} 

Сноска

Если вы хотите ждать, пока следующего кадра, используйте:

yield return null; 

, если у вас есть «стек» вещи, которые вы хотите сделать каждый кадр, просто сделайте это

void Update() 
    { 
    if (newItem = yourStack.Pop()) 
    newItem(); 
    } 

если у вас есть «стек» вещей, которые вы хотите сделать ждет каждого, чтобы закончить,

void Start() 
{ 
StartCoroutine(YourStackLoop()); 
} 
private IEnumerator stackLoop() 
    { 
    while(true) 
    { 
    if (newItem = yourStack.Pop()) 
     yield return StartCoroutine(newItem()); 
    else 
     yield return new; 
    } 
    } 

Обратите внимание, что обновление и сопрограмма являются принципиально то же самое, читать и учиться на этом.

Примечание в примере в примере используйте свой обычный Push/Pop (или FIFO или что хотите). Если вы не знакомы, найдите здесь много QA.

+0

Мне нужно подождать, пока предыдущая функция не закончится, чтобы выполнить следующее в массиве , Просто ждать следующего кадра не будет, потому что некоторые действия требуют перемещения в определенную позицию, и это занимает переменное количество времени. Я прочитал, что есть заявление, называемое yield waitUntil/waitWhile, но я не нашел много документации по их внедрению. –

+0

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

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

  • Нет связанных вопросов^_^