一旦计数器达到某个数字,就运行IEnumerator函数

时间:2018-05-09 06:02:59

标签: c# unity3d scripting ienumerator

所有!一旦我的计数器达到一定数量,我就试图运行一个过程。

我目前在更新功能上有这部分代码:

if (counter == 17)
{
  // must call process here
}

这是我想要运行的过程

   private void CallProcess()
   {
     StartCoroutine(StartProcess());
   } 

这是IEnumerator的整个代码

 private IEnumerator StartProcess()
    {
       yield return StartCoroutine (Process1()); //once done, a bool here is set to true
      if (proccess1_done)
      {
        yield return StartCoroutine (Process2());
        if (process2_done)
        {
          process1_done = false;
          process2_done = false;
        }
      }

    }

当我在我的更新bc中调用CallProcess()时遇到问题,它会被一遍又一遍地调用。关于如何修改我的代码的任何建议都将非常感激。

1 个答案:

答案 0 :(得分:2)

请勿在更新中调用StartCoroutine。相反,将boolean包装在属性中,以便在更改或设置时,也可以调用StartCoroutine。

让我们说计数器是设置它的那个:

private IEnumerator coroutine = null;
private int counter = 0;
public int Counter 
{
    get{ return this.counter; }
    set
    {
         this.counter =  value;
         if(this.counter == conditionValue)
         { 
             if(this.coroutine != null){ return; } // already running
             this.coroutine = StartProcess();
             StartCoroutine(this.coroutine); }
    }
}

和你的协程:

private IEnumerator StartProcess()
{
   yield return StartCoroutine (Process1()); 
   yield return StartCoroutine (Process2());
}

你真的不需要检查进程1是否已经完成,因为你的协程已经在等待它继续之前完成。

如果您需要检查进程1中的某些内容以运行进程2,这是一个解决方案:

private IEnumerator StartProcess()
{
   bool condition = false;
   yield return StartCoroutine (Process1(ref condition));
   if(condition == false){ yield break; } 
   yield return StartCoroutine (Process2());
   this.coroutine = null;
}

private IEnumerator Process1(ref bool condition)
{
     // some code
     yield return null;
     // more code
     condition = true; // or false
}