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时要避免使用协程。 (有关协同程序的高级 文章)
3)“我需要等待前一个函数结束后再执行以下函数”
a)每个这样的函数必须是一个IEnumerator。
private IEnumerator ExplodeCar()
{
..
}
private IEnumerator CrowdReaction()
{
..
}
private IEnumerator WinningCelebration()
{
..
}
b) 一个接一个地调用它们,等待每个完成。
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或任何您希望的)操作。如果不熟悉,请搜索许多关于此的问答。
Invoke()
的延迟时间。(这在电影制作中会更适用,因为节奏应该基于时间。) - Serlite