我的代码中有一个协程(每秒移动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
变量,以便当我再次调用它时,它会执行预期的操作?
不要将协程调用添加到这样的数组中。它不执行您想要的操作。
这应该可以代替:
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级别才能获得所需的结果。