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.
Вы могли бы поделиться своим кодом (например, где вы пытаетесь выполнить функции в порядке)? Знаете ли вы, как долго каждая функция будет выполнена? В этом случае вы можете просто компенсировать время задержки 'Invoke()'. (Это было бы более применимо в случае кинематографии, где стимуляция должна, вероятно, основываться на времени.) – Serlite
Обновлено с помощью кода @Serlite –