【问题标题】:Run IEnumerator functions once counter hits certain number一旦计数器达到某个数字,就运行 IEnumerator 函数
【发布时间】:2018-05-09 06:02:59
【问题描述】:

全部!一旦我的计数器达到某个数字,我就会尝试运行一个进程。

我目前在我的更新函数中有这部分代码:

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;
        }
      }

    }

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

【问题讨论】:

  • 为什么不像你使用 process1_done 那样使用布尔值?类似于bool isStartingProcess
  • 正如@SwiftingDuster 所说,为什么不使用布尔值?在进入调用时关闭isStartingProcess,即在CallProcess()中,并在协程结束时再次启用它,应该可以解决问题。
  • 我已经尝试过 if (counter == 17) { isStartProcess = true} if (isProcess true) { CallProcess();} 但似乎都是重叠的。

标签: c# unity3d scripting ienumerator


【解决方案1】:

不要在更新中调用 StartCoroutine。相反,将布尔值包装在一个属性中,以便在更改或设置它时,您还可以调用 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
}

【讨论】:

  • 感谢您的澄清!让我快速尝试一下
猜你喜欢
  • 2021-12-02
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-17
  • 2022-12-12
  • 2020-09-29
相关资源
最近更新 更多