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

Events Unity/C#:如何在另一个函数完成执行后执行该函数?,events,unity3d,delegates,yield,coroutine,Events,Unity3d,Delegates,Yield,Coroutine,我一直在尝试为我正在进行的一个项目构建一个“事件系统”。我是这样做的:我填充了一个列表,其中引用了一个游戏对象以及我需要从该游戏对象执行的函数。然后,当“事件”被触发时(在本例中,当玩家进入触发碰撞器时),我只是在列表上循环并调用其中的函数 问题是列表中的每个函数都是同时执行的。这在某些情况下效果很好,但如果我想创建一个更具电影效果的事件,我需要有能力在前一个函数完成执行后执行它。遗憾的是,我不知道如何做到这一点 我已经阅读了很多Unity和C关于协同程序和委托的文档,但我似乎不能把所有这些事情

我一直在尝试为我正在进行的一个项目构建一个“事件系统”。我是这样做的:我填充了一个列表,其中引用了一个游戏对象以及我需要从该游戏对象执行的函数。然后,当“事件”被触发时(在本例中,当玩家进入触发碰撞器时),我只是在列表上循环并调用其中的函数

问题是列表中的每个函数都是同时执行的。这在某些情况下效果很好,但如果我想创建一个更具电影效果的事件,我需要有能力在前一个函数完成执行后执行它。遗憾的是,我不知道如何做到这一点

我已经阅读了很多Unity和C关于协同程序和委托的文档,但我似乎不能把所有这些事情都放在心上,并找到一种在代码上实现它们的方法。所以我需要你的帮助:我如何实现这一点?

1)使用
调用

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。当你只是在学习团结时,避免共事。(在协同程序中处于高级状态。)


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,或任何您想要的)。如果不熟悉,请在此处搜索多个QA。

您是否可以共享一些代码(例如您尝试按顺序执行函数的位置)?你知道每个功能需要多长时间才能完成吗?在这种情况下,您可以抵消
Invoke()
延迟时间。(这在电影中更为适用,在电影中,步调可能应该是基于时间的。)使用代码@Serlite更新需要等待上一个函数结束,以便在阵列中执行下一个函数。仅仅等待下一帧是不行的,因为某些操作需要移动到某个位置,并且需要花费的时间也不尽相同。我已经读到一个名为yield waitUntil/waitWhile的语句,但我还没有找到很多关于它们实现的文档。感谢您的输入,我会在课程结束后的几个小时内尝试上面列出的方法,然后我会回复你,告诉你它是否有效。谢谢你的帮助和时间。