如何重设IEnumerator变量?

问题描述 投票:1回答:1

我的代码中有一个协程(每秒移动1单位距离)。

public IEnumerator Move(int distance){...}

我有一个IEnumerator列表,这些列表基本上是此协程的调用:

public List<IEnumerator> routines = new List<IEnumerator>();

void Start(){ routines.Add(Move(1)); routines.Add(Move(-1)); }

我希望我的对象永远向前和向后移动,所以我尝试了这个:

public IEnumerator LoopMovement(){
    while(true){
        StartCoroutine(routines[0]);
        yield return new WaitForSeconds(1);
        StartCoroutine(routines[1]);
        yield return new WaitForSeconds(1);
    }
}

它在第一个循环中工作正常,但是在此之后,它什么也没做。我猜这是因为列表IEnumerator中的routines变量已经完成了工作,并且在再次调用时不会重复。如何重置IEnumerator变量,以便当我再次调用它时,它会执行预期的操作?

unity3d coroutine ienumerator
1个回答
4
投票

不要将协程调用添加到这样的数组中。它不执行您想要的操作。

这应该可以代替:

public IEnumerator LoopMovement(){
    while(true){
        yield return Move(1);
        yield return new WaitForSeconds(1);
        yield return Move(-1);
        yield return new WaitForSeconds(1);
    }
}

现在,如果您要设置一个动作列表,以便无需修改LoopMovement就可以修改list,那么您必须创建一个delegates列表(又名方法引用,下面使用Func而不是yield语句的指针(kinda-sorta Func对于协程是什么)。

类似这样的东西:

IEnumerator

....

public List<Func<int,IEnumerator>> routines = new List<Func<int,IEnumerator>>();
routines.Add(Move);
routines.Add(Move);

您将需要考虑如何public IEnumerator LoopMovement(){ while(true){ yield return routines[0](1); yield return new WaitForSeconds(1); yield return routines[1](-1); yield return new WaitForSeconds(1); } } 您的移动方法,以便可以有一组一致的参数,并且可能需要涉及多个Type级别才能获得所需的结果。

© www.soinside.com 2019 - 2024. All rights reserved.