Установите переменную класса в сопрограмме IEnumerator - PullRequest
0 голосов
/ 11 декабря 2018

Мне нужно выполнить некоторую работу по инициализации в Update().

Эта работа по инициализации занимает некоторое время, и я не могу продолжить работу с обычным кодом в Update(), пока эта инициализация не закончится.

Кроме того, для этой инициализации требуется некоторое WaitForSeconds().

Поэтому я попробовал следующее:

private bool _bInitialized = false;
private bool _bStarted = false;

void Update()
{
    if (!_bInitialized)
    {
         if (!_bStarted)
         {
             _bStarted = true;
             StartCoroutine(pInitialize());
         }
         return;
    }

    (...) do stuff that can only be done after initialization has been completed
}

Однако, похоже, я не могу изменить переменную_bInitialized в пределах IEnumerator.

_bInitialized никогда не становится true:

private IEnumerator pInitialize()
{
    WiimoteManager.Cleanup(_wii);
    yield return new WaitForSeconds(2);

    _wii = WiimoteManager.Wiimotes[0];
    yield return new WaitForSeconds(2);

    _wii.SetupIRCamera(IRDataType.BASIC);
    yield return new WaitForSeconds(2);

    _bInitialized = true; //this doesn't seem to work
    yield return 0;
}

Может кто-нибудь сказать мне, как это сделать правильно?

Большое спасибо!

1 Ответ

0 голосов
/ 11 декабря 2018

Я думаю, что StartCoroutine не перечисляет все значения по какой-либо причине.

Поскольку Enumerator лениво генерирует свои значения, а не все значения генерируются,

_bInitialized = true;

никогда не вызывается.

Вы можете подтвердить это, добавив

var enumerator = pInitialize(); while ( enumerator.MoveNext() )
{
    // do nothing - just force the enumerator to enumerate all its values
}

Как предлагается в один из комментариев by Antoine Thiry ,

Здесь может произойти то, что ваш код в сопрограмме молча генерирует и ловит исключение, возможно, часть кода в WiimoteManager что-то имеетделать с этим.

...