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 时,请避免使用协程。 (高级 essay 协程。)
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;
}
}
请注意,Update 和协程本质上是一回事,请阅读并研究这一点。
注意 在示例中,使用您自己常用的 Push/Pop(或 FIFO,或任何您想要的)。如果不熟悉,请在此处搜索许多 QA。