【问题标题】:How to reset IEnumerator variable?如何重置 IEnumerator 变量?
【发布时间】:2020-04-15 20:42:48
【问题描述】:

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

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

我有一个IEnumerators 列表,它们基本上是这个协程的调用:

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 变量,以便当我再次调用它时它会执行应有的操作?

【问题讨论】:

  • 您可以创建一个命令队列,当有一个项目时,执行它,否则只需等待一秒钟......等等......但这似乎不是一个好方法

标签: unity3d coroutine ienumerator


【解决方案1】:

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

这应该可以代替:

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)而不是指向yield语句的指针(有点像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你的运动方法,这样你就可以拥有一组一致的参数,并且可能需要涉及多个级别的Generics才能达到预期的结果。

【讨论】:

  • 我的问题,事实上,只是我的问题的一小部分。我有很多IEnumerators,比如Move,比如JumpShootFly等,每个都有自己的参数和其他东西。列表routines 存储了很多这些,这就是为什么我按照我展示的方式进行操作,我需要一种方法来重置IEnumerator 变量。
  • 你不能,但是。 “重置”它的唯一方法是调用Move(1)。没有办法按照你的要求去做。你需要重组。
猜你喜欢
  • 2019-05-12
  • 1970-01-01
  • 1970-01-01
  • 2014-01-08
  • 2016-08-02
  • 1970-01-01
  • 2018-08-14
  • 2019-07-06
  • 2016-07-13
相关资源
最近更新 更多