Запустите функции IEnumerator, если счетчик достигнет определенного числа - PullRequest
0 голосов
/ 09 мая 2018

Все! Я пытаюсь запустить процесс, когда мой счетчик наберет определенное число.

У меня в данный момент есть часть кода в моей функции обновления:

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 () внутри моего обновления bc, оно вызывается снова и снова. Буду очень признателен за любые советы о том, как мне следует изменить мой код.

1 Ответ

0 голосов
/ 09 мая 2018

Не вызывайте 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
}
...