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

4
我一直在尝试为正在进行的项目构建一个“事件系统”。我的方法是:我用一个列表来填充对游戏对象的引用和我需要从该游戏对象执行的功能。然后,当“事件”被触发时(在这种情况下,当玩家踏入触发器碰撞体时),我只需循环列表并调用其中的函数。
问题在于列表中的每个函数都会同时执行。这在某些情况下可以正常工作,但如果我想创建一个更具电影效果的事件,我需要能够在前一个函数执行完成后执行下一个函数。遗憾的是,我不知道如何做到这一点。
我已经阅读了Unity和C#的许多文档,包括协同程序和委托,但我似乎无法理解所有这些内容,并找到一种在代码上实现它们的方法。所以我需要你的帮助:我该如何实现这个?

你能分享一些你的代码吗(例如你试图在哪里执行这些函数)?你知道每个函数需要多长时间才能完成吗?如果是这样,你可以只需调整 Invoke() 的延迟时间。(这在电影制作中会更适用,因为节奏应该基于时间。) - Serlite
更新了代码 @Serlite - Francisco M.
1个回答

10

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或任何您希望的)操作。如果不熟悉,请搜索许多关于此的问答。

我需要等待前一个函数结束后才能执行数组中的下一个函数。仅仅等待下一帧是不够的,因为有些操作需要移动到特定位置,这需要不同的时间。我已经了解到有一个叫做yield waitUntil/waitWhile的语句,但是我没有找到很多关于它们实现的文档。 - Francisco M.
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Francisco M.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接