在IEnumerator协程中设置类变量

时间:2018-12-11 13:07:30

标签: c# unity3d ienumerator

我需要在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 :(得分:0)

我认为StartCoroutine并非出于任何原因枚举所有值。

Enumerator懒惰地生成其值时,并非所有值都被生成,

_bInitialized = true;

从不叫。

您可以通过添加

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

根据one of the commentsAntoine Thiry中的建议,

  

这里可能发生的情况是,协程中的代码正在默默地抛出并捕获异常,也许WiimoteManager中的某些代码与此有关。