2016-03-04 610 views
1

我一直在试图为我正在开发的一个项目构建一个“事件系统”。下面是我如何做的:我通过引用一个gameObject和我需要从那个gameObject执行的函数来填充一个列表。然后,当“事件”被触发时(在这种情况下,当玩家步入触发器对撞机时),我只是遍历列表并调用其中的函数。Unity/C#:如何在另一个函数完成其执行后执行一个函数?

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

我一直在阅读很多关于协程和代表的Unity和C#的文档,但我似乎无法将我的头围绕所有这些东西,并找到一种方法来在代码上实现它们。所以我需要你的帮助:我怎样才能做到这一点?

+0

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

+0

用代码@Serlite更新 –

回答

3

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。当你刚刚学习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; 
    } 
    } 

注意,更新和协同程序是基本上是相同的事情,读,这项研究。

注意在这个例子中,使用你自己常用的Push/Pop(或者FIFO,或者你想要的任何东西)。如果不熟悉,请在这里搜索许多QA。

+0

我需要等到前一个函数结束才能执行数组中的下一个函数。只是等待下一帧将不会这样做,因为某些动作需要移动到某个位置,并且需要不同的时间。我读过有一条语句叫yield waitUntil/waitWhile,但我没有发现很多关于其实施的文件。 –

+0

感谢您的输入,我会在完成课程的几个小时后尝试上面列出的方法,然后我会回复您,告诉您它是否有效。感谢您的帮助和时间。 –

相关问题