gpt4 book ai didi

events - 统一/C# : How to execute a function after another function has finished its execution?

转载 作者:行者123 更新时间:2023-12-03 20:34:10 24 4
gpt4 key购买 nike

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

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

我已经阅读了很多关于协程和委托(delegate)的 Unity 和 C# 文档,但我似乎无法解决所有这些问题并找到一种在代码上实现它们的方法。所以我需要你的帮助那:我怎样才能做到这一点?

最佳答案

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。

关于events - 统一/C# : How to execute a function after another function has finished its execution?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35803184/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com