c# - 我是否正确理解协程?
问题描述
我正在编写我的第一个 Unity 游戏。我有一系列嵌套函数,我们称它们为 Function1、Function2 等。假设在 Function3 中,我想在执行更多代码之前显示一小段时间。
如果我将 Function3 设为 Coroutine 并以 yield return new WaitForSeconds 退出,这并不会阻止我的其他函数中的所有代码执行,而只是阻止 Function3 中其余代码的执行,对吧?与此同时,Functions1 和 2 继续他们的快乐之路。
有没有什么方法可以得到我想要的东西,而不需要将每个函数重组为协程并放入大量的产量和真实的陈述?(在我的实际游戏中,在我想成为协程的函数之前还有很多函数。)
我将添加一些伪代码来说明我的情况。
谢谢。
public Function1()
{
.
.
Does some stuff
.
.
call Function2()
.
.
Do some more stuff
.
.
}
public Function2()
{
.
.
Does some stuff
.
.
StartCoroutine(Function3())
.
.
Does some more stuff
.
.
return to Function2;
}
IEnumerator Function3()
{
.
.
Does some stuff...
Now I want to wait for specified time (say, .5 seconds) to display a message, play a sound, etc., **without continuing the code in Function2 or Function1 * *!
yield return new WaitForSeconds(.5f)
Then do some more stuff
.
.
return to Function2;
}
解决方案
有多种方法可以这样做,但是我更喜欢使用在协程“完成”时调用的回调操作。
public IEnumerator Function1(Action callback)
{
// do some stuff
yield return new WaitForSeconds(1);
// do some stuff
callback.Invoke();
}
public IEnumerator Function2(Action callback)
{
// do some stuff
yield return new WaitForSeconds(1);
// do some stuff
callback.Invoke();
}
public void CallingMethod()
{
StartCoroutine(Function1(() =>
{
StartCoroutine(Function2(() =>
{
// whatever other code you want executed
}));
}));
}
这种方法避免了使用类标志(布尔值),这很容易使您的代码混乱。此外,它允许您的方法轻松重用。
推荐阅读
- javascript - 使用nodejs的HTML中一个表格行中的两个数组
- angular - 角度 DOM 中的 StaticInjectorError
- java - 如何使用 webview 获取最后更新的 HTML 内容?
- javascript - 如果按下 Enter,则获取输入的值 - 从外部函数
- arrays - 如何使用 Twitter API 中的 User_Id 列表?
- mysql - MySQL使用外键访问父行?
- php - Laravel - 在 Jobs 中使用图像干预。路径错误
- tensorflow - 为什么没有将 L2 正则化添加回原始损失函数?
- c++ - 当我尝试在我的代码中使用宏时,我收到类似“预期标识符”的错误
- python - 如何在Python中数字的不同位置添加点分隔符?