延迟开关场景C#Unity

时间:2019-02-25 14:24:16

标签: c# unity3d timer switch-statement

我正在创建一个将QR码检测为目标图像的AR应用程序。我正在检测4个QR码,一旦检测到QR码,就需要加载一个新场景。我在OnTrackingFound事件下的DefaultTrackableEventHandler脚本中使用了switch语句。

switch语句有效。一旦检测到目标图像,它将切换到新场景。问题是切换速度太快。我该如何延迟?我尝试了Invoke()方法和IEnumarator方法,但没有成功。

这是我的代码:

protected virtual void OnTrackingFound()
    {
        var rendererComponents = GetComponentsInChildren<Renderer>(true);
        var colliderComponents = GetComponentsInChildren<Collider>(true);
        var canvasComponents = GetComponentsInChildren<Canvas>(true);

        // Enable rendering:
        foreach (var component in rendererComponents)
            component.enabled = true;

        // Enable colliders:
        foreach (var component in colliderComponents)
            component.enabled = true;

        // Enable canvas':
        foreach (var component in canvasComponents)
            component.enabled = true;


// This is where it detects the image target and loads new scene.
        switch (mTrackableBehaviour.TrackableName)
        {
          case "HLQRj":
                Invoke("PrintGRV", 5);
                SceneManager.LoadScene("PrintGRV");
                break;
           case "FSQRj":
                Invoke("PrintGRV", 5);
                SceneManager.LoadScene("PrintGRV");
                break;
           case "BPQRj":
                Invoke("PrintGRV", 5);
                SceneManager.LoadScene("PrintGRV");
                break;
           case "SPQRj":
                Invoke("PrintGRV", 5);
                SceneManager.LoadScene("PrintGRV");
                break;

        }

    }

1 个答案:

答案 0 :(得分:2)

这取决于您需要等待多长时间以及需要等待什么...例如对于固定的延迟时间,您可以简单地使用Coroutine例如使用WaitForSeconds

private IEnumerator SwitchScene()
{
    // waits for 2 seconds
    yield return new WaitForSeconds(2);

    SceneManager.LoadScene("PrintGRV");
}

并像运行

switch (mTrackableBehaviour.TrackableName)
{
    case "HLQRj":
        Invoke("PrintGRV", 5);
        StartCoroutine(SwitchScene());
        break;
    //...
}

如果您要等到某种其他异步方法完成后,也可以例如等待Draco18s正确提到的布尔标志变为真时,您只需使用WaitUntil

private bool xyIsDone = false;

private IEnumerator SwitchScene()
{
    // wait until xyIsDone becomes true
    WaitUntil(xyIsDone);

    SceneManager.LoadScene("PrintGRV");
}