【问题标题】:Unity/C# : How to execute a function after another function has finished its execution?Unity/C#:如何在另一个函数完成执行后执行一个函数?
【发布时间】:2016-06-18 14:37:26
【问题描述】:

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

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

我一直在阅读 Unity 和 C# 中关于协程和委托的大量文档,但我似乎无法完全理解所有这些内容并找到一种在代码上实现它们的方法。所以我需要你的帮助:我怎样才能做到这一点?

【问题讨论】:

  • 你能分享你的一些代码吗(比如你试图按顺序执行函数的地方)?你知道每个功能需要多长时间才能完成吗?在这种情况下,您可以抵消您的 Invoke() 延迟时间。 (这将更适用于电影的情况,其中节奏可能应该是基于时间的。)
  • 更新代码@Serlite

标签: events unity3d delegates yield coroutine


【解决方案1】:

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。

【讨论】:

  • 我需要等到前一个函数结束才能执行数组中的下一个函数。仅仅等待下一帧是不行的,因为有些动作需要移动到某个位置,这需要不同的时间。我读过有一个叫做 yield waitUntil/waitWhile 的语句,但我没有找到很多实施文档。
  • 感谢您的意见,我会在课程结束后的几个小时内尝试上面列出的方法,然后我会回复您告诉您是否有效。感谢您的帮助和时间。
猜你喜欢
  • 1970-01-01
  • 2013-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多