Unity / C#:在另一个函数完成执行后如何执行一个函数?

Fra*_* M. 2 events delegates yield coroutine unity-game-engine

我一直在尝试为我正在从事的项目构建“事件系统”。这是我的操作方法:我参照一个gameObject以及需要从该gameObject执行的功能填充一个列表。然后,当“事件”被触发时(在这种情况下,当玩家进入触发对撞机时),我只需遍历列表并调用其中的功能。

问题在于列表中的每个函数都同时执行。在某些情况下这可以正常工作,但是如果我想创建一个更具电影风格的事件,我需要有能力在上一个函数完成执行后执行一个函数。可悲的是,我不知道该怎么做。

我已经阅读了很多有关协程和委托的Unity和C#文档,但是我似乎无法将所有这些东西都缠起来,并找到一种在代码上实现它们的方法。因此,我需要您的帮助:我如何实现这一目标?

Fat*_*tie 5

1)使用 Invoke

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

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();
}
Run Code Online (Sandbox Code Playgroud)

您必须同时掌握协程和调用。请确保尽可能使用Invoke。在学习Unity时,避免协程。(有关协程的高级文章。)

3)“我需要等到上一个功能结束后才能执行下一个功能”

a)每个这些功能必须是IEnumerator

private IEnumerator ExplodeCar()
 {
 ..
 }

private IEnumerator CrowdReaction()
 {
 ..
 }

private IEnumerator WinningCelebration()
 {
 ..
 }
Run Code Online (Sandbox Code Playgroud)

b)一个接一个地叫他们,等待每个人完成

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

private IEnumerator Seq()
 {
 yield return StartCoroutine(ExplodeCar());
 yield return StartCoroutine(CrowdReaction());
 yield return StartCoroutine(WinningCelebration());
 }
Run Code Online (Sandbox Code Playgroud)

脚注

如果要等到下一帧,请使用:

yield return null;
Run Code Online (Sandbox Code Playgroud)

如果您有一堆要在每一帧中执行的操作,则只需执行此操作

void Update()
  {
  if (newItem = yourStack.Pop())
    newItem();
  }
Run Code Online (Sandbox Code Playgroud)

如果您有一堆事情要等待每件事完成

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

请注意,Update和协程从根本上是同一件事,请对此进行阅读和研究。

请注意,在示例中,请使用您自己的常规“推入/弹出”(或FIFO,或您想要的任何东西)。如果不熟悉,请在此处搜索许多质量检查。