Unity3d 唯一地标识每个IEnumerator

Unity3d 唯一地标识每个IEnumerator,unity3d,Unity3d,我的玩家角色会产生多种颜色的波浪,并尝试检测即将到来的对象。 以下是总体构思的小快照: 为了测试的目的,我产生了粉红色和蓝色的波浪。我使用IEnumerator(线程)生成每个颜色波。 现在,两个枚举器/线程分别工作,并正确地完成了它们的工作。我对他们的工作没有意见 现在我需要一些标识符或索引来唯一地标识每个正在运行的线程,以及如何使用我不知道的c#来管理它 您可以通过创建IEnumerator对象列表来实现这一点,如 List<IEnumerator> coroutines =

我的玩家角色会产生多种颜色的波浪,并尝试检测即将到来的对象。 以下是总体构思的小快照:

为了测试的目的,我产生了粉红色和蓝色的波浪。我使用IEnumerator(线程)生成每个颜色波。 现在,两个枚举器/线程分别工作,并正确地完成了它们的工作。我对他们的工作没有意见


现在我需要一些标识符或索引来唯一地标识每个正在运行的线程,以及如何使用我不知道的c#来管理它

您可以通过创建
IEnumerator
对象列表来实现这一点,如

List<IEnumerator> coroutines = new List<IEnumerator>();
如果将
yield return null
添加到协同程序的最后一行,则可以使用
IEnumerator.Current

IEnumerator CoroutineOne()
{
    for(int i = 0; i < 5; i++)
    {
        Debug.Log("one" + i);
        yield return new WaitForSeconds(1);
    }
    yield return null;
}

这将只保留列表中的活动索引,您可以使用
coroutine.Count
获取一次活动的索引数/获取数组的有效索引您可以通过创建
IEnumerator
对象列表来实现这一点,如

List<IEnumerator> coroutines = new List<IEnumerator>();
如果将
yield return null
添加到协同程序的最后一行,则可以使用
IEnumerator.Current

IEnumerator CoroutineOne()
{
    for(int i = 0; i < 5; i++)
    {
        Debug.Log("one" + i);
        yield return new WaitForSeconds(1);
    }
    yield return null;
}


这将只在列表中保留活动的线程,您可以使用
coroutine.Count
获取一次活动的线程数/获取数组的有效索引

这有点吹毛求疵,但您真的不应该将IEnumerator视为线程,它们不是单独的线程,它们都在同一个线程上。它们只是暂停和恢复函数执行的简单方法,但它们的行为不会相互干扰-如果我两次依次调用IEnumerator,那么两个任务都会从a到Z成功完成-我需要多次调用IEnumerator,因此我希望识别每个执行id。每次启动协同路由它构造一个新的
IEnumerator
对象,每个对象独立运行,但每个帧都将运行一次执行(即使该执行正在等待),并且它们将在同一线程上按顺序执行。如果你喜欢的话,你可以阅读它是如何工作的,我正在让你正确地进入这个:)这有点吹毛求疵,但你真的不应该把IEnumerator看作线程,它们不是一个单独的线程,它们都在同一个线程上。它们只是暂停和恢复函数执行的简单方法,但它们的行为不会相互干扰-如果我两次依次调用IEnumerator,那么两个任务都会从a到Z成功完成-我需要多次调用IEnumerator,因此我希望识别每个执行id。每次启动协同路由它构造一个新的
IEnumerator
对象,每个对象独立运行,但每个帧都将运行一次执行(即使该执行正在等待),并且它们将在同一线程上按顺序执行。如果你喜欢,你可以阅读它是如何工作的,我会让你正确地进入这个:)谢谢你给我展示了一种处理这种情况的方法-一个基于你的IEnumerator的问题。当前的概念-你解释了这一点来检测协同程的结束吗?你问了如何管理每个正在运行的协同程,这将让您看到一个是否仍在运行或已结束感谢您-现在让我在我的项目中实施您的建议,并为您提供成功的反馈:)但是,在IEnumerator执行中,我如何检测列表中的索引是什么我的IEnumerator列表不会像您在上述示例中提到的那样固定,但它将取决于玩家将产生多少波。@Siddharth我编辑了我的答案以更好地回答您的问题谢谢您向我展示了一种处理这种情况的方法-一个基于IEnumerator的问题。当前的概念-您向我解释过吗检测协同程序的结束?您询问了如何管理每个正在运行的协同程序,这将让您查看是否有一个协同程序仍在运行或已结束。谢谢-现在让我在我的项目中实施您的建议,并向您反馈成功情况:)但是,在IEnumerator执行过程中,我如何检测列表中的索引是什么我的IEnumerator列表不会像您在上述示例中提到的那样固定,但它将取决于玩家将生成多少波。@Siddharth我编辑了我的答案,以便更好地回答您的问题
coroutines.RemoveAll(x => x.Current == null);