我的代码中有一个移动协程(它每秒移动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);
}
}它在第一个循环中工作得很好,但在此之后,它不会做任何事情。我猜这是因为列表routines中的IEnumerator变量已经完成了它们的工作,在再次调用时不会重复。如何重置IEnumerator变量,以便再次调用它时,它可以执行预期的操作?
发布于 2019-12-25 11:37:17
不要将协程调用添加到这样的数组中。它没有做你想让它做的事情。
相反,这应该是可行的:
public IEnumerator LoopMovement(){
while(true){
yield return Move(1);
yield return new WaitForSeconds(1);
yield return Move(-1);
yield return new WaitForSeconds(1);
}
}现在,如果你想设置一个操作列表,这样你就可以在不修改LoopMovement的情况下修改这个列表,那么你必须创建一个委托列表(也就是方法引用,下面使用Funcs),而不是指向输出语句的指针(有点像IEnumerator对协程的作用)。
如下所示:
public List<Func<int,IEnumerator>> routines = new List<Func<int,IEnumerator>>();
routines.Add(Move);
routines.Add(Move);..and..
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您的移动方法,以便您可以拥有一致的参数集,并且可能需要涉及多个级别的Generics才能获得所需的结果。
https://stackoverflow.com/questions/59474306
复制相似问题