首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何重置IEnumerator变量?

如何重置IEnumerator变量?
EN

Stack Overflow用户
提问于 2019-12-25 08:12:13
回答 1查看 150关注 0票数 1

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

代码语言:javascript
复制
public IEnumerator Move(int distance){...}

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

代码语言:javascript
复制
public List<IEnumerator> routines = new List<IEnumerator>();

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

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

代码语言:javascript
复制
public IEnumerator LoopMovement(){
    while(true){
        StartCoroutine(routines[0]);
        yield return new WaitForSeconds(1);
        StartCoroutine(routines[1]);
        yield return new WaitForSeconds(1);
    }
}

它在第一个循环中工作得很好,但在此之后,它不会做任何事情。我猜这是因为列表routines中的IEnumerator变量已经完成了它们的工作,在再次调用时不会重复。如何重置IEnumerator变量,以便再次调用它时,它可以执行预期的操作?

EN

回答 1

Stack Overflow用户

发布于 2019-12-25 11:37:17

不要将协程调用添加到这样的数组中。它没有做你想让它做的事情。

相反,这应该是可行的:

代码语言:javascript
复制
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对协程的作用)。

如下所示:

代码语言:javascript
复制
public List<Func<int,IEnumerator>> routines = new List<Func<int,IEnumerator>>();
routines.Add(Move);
routines.Add(Move);

..and..

代码语言:javascript
复制
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才能获得所需的结果。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59474306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档