Fra*_* M. 2 events delegates yield coroutine unity-game-engine
我一直在尝试为我正在从事的项目构建“事件系统”。这是我的操作方法:我参照一个gameObject以及需要从该gameObject执行的功能填充一个列表。然后,当“事件”被触发时(在这种情况下,当玩家进入触发对撞机时),我只需遍历列表并调用其中的功能。
问题在于列表中的每个函数都同时执行。在某些情况下这可以正常工作,但是如果我想创建一个更具电影风格的事件,我需要有能力在上一个函数完成执行后执行一个函数。可悲的是,我不知道该怎么做。
我已经阅读了很多有关协程和委托的Unity和C#文档,但是我似乎无法将所有这些东西都缠起来,并找到一种在代码上实现它们的方法。因此,我需要您的帮助:我如何实现这一目标?
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,或您想要的任何东西)。如果不熟悉,请在此处搜索许多质量检查。
归档时间: |
|
查看次数: |
6357 次 |
最近记录: |