试着弄清楚协程是否是正确的方法。
我有3个不同的类来执行操作;我希望这3个课程能够以任何顺序完成他们的工作,一旦完成所有3个课程,我可以继续进行下一个循环并再次调用这3个课程中的方法来重新开始。
就像现在一样,我在每个班级都有一个方法来完成工作;在主类中,我创建了一个协程,这是我程序的主循环。 协程的条件是必须完成3个类中的所有3个方法,在while循环中产生返回void。这是协程的简化版本:
IEnumerator void loopFunction()
{
while (!classA.method() && !classB.method() && !classC.method())
{
yeld return void;
}
// do some updates
// start all over again
}
这是否可以正确实施,还是应该采用不同的方法?目标是有一个每X秒执行一次的循环,并且只有在完成其中的所有方法时才开始新的循环。
编辑:
在浏览时我发现可以实际使用多线程,旧的" System.Threading"因为Unity只支持Net 3.5。
线程似乎是另一种可行的选择;虽然我听说Unity本身不是线程安全的,所以我不确定你是否可以在coroutine中的不同类中运行函数作为单独的线程。
答案 0 :(得分:0)
这取决于这些方法如何与游戏的其他部分互动。协程提供了一种并发形式,而线程提供了一种并行形式。
如果你真的需要并行化操作,只使用线程,因为其余的协同程序非常好。
协同程序只是提供了一种机制来组成独立执行的代码块,其中此执行是交错的,而不是并行化的。协程与任何其他通用方法/功能之间基本上没有区别,除了它(容易)暂停执行特定时期的能力。
简单地说,协程是关于结构的,线程是关于执行的。如果您只是想在多个帧中传播一组操作,那么协同程序提供了一种很好的方法来实现这一点。协同程序在主线程上执行,因此只要您的三种方法正在运行,游戏的其他部分就会被暂停 - 您的代码控制着“暂停”操作。
如果您的应用程序在可以并行化操作的硬件平台(多核或多处理器)上运行,并且您想要利用这种潜力,那么请查看线程。或者,如果您使用第三方库并且无法控制特定操作需要多长时间(并且需要太长时间),那么您也可以考虑使用线程。显然,它带来了一些额外的复杂性,请记住Unity不是线程安全的,因此如果您的操作以任何方式与Unity API进行交互,您需要注意通过某种锁定来适当地同步您的方法。不要直接从另一个线程访问Unity对象。