Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
延迟开关场景C#Unity_C#_Unity3d_Timer_Switch Statement - Fatal编程技术网

延迟开关场景C#Unity

延迟开关场景C#Unity,c#,unity3d,timer,switch-statement,C#,Unity3d,Timer,Switch Statement,我正在创建一个AR应用程序,将QR码检测为目标图像。我检测到4个二维码,一旦检测到一个二维码,需要加载一个新场景。我正在OnTrackingFound事件下的DefaultTrackableEventHandler脚本中使用switch语句 switch语句有效。一旦检测到目标图像,它将切换到新场景。问题是它切换得太快。我怎么能推迟呢?我尝试了Invoke()方法和IEnumerator方法,但没有成功 这是我的密码: protected virtual void OnTrackingFound

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

switch语句有效。一旦检测到目标图像,它将切换到新场景。问题是它切换得太快。我怎么能推迟呢?我尝试了Invoke()方法和IEnumerator方法,但没有成功

这是我的密码:

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;

        }

    }
受保护的虚拟空间OnTrackingFound()
{
var renderComponents=GetComponentsInChildren(true);
var colliderComponents=GetComponentsInChildren(true);
var canvasComponents=GetComponentsInChildren(true);
//启用渲染:
foreach(RenderComponents中的变量组件)
component.enabled=true;
//启用碰撞器:
foreach(colliderComponents中的var组件)
component.enabled=true;
//启用画布':
foreach(canvasComponents中的var组件)
component.enabled=true;
//这是它检测图像目标并加载新场景的地方。
开关(MTrackableBehavior.TrackableName)
{
案例“HLQRj”:
调用(“PrintGRV”,5);
场景管理器。加载场景(“PrintGRV”);
打破
案例“FSQRj”:
调用(“PrintGRV”,5);
场景管理器。加载场景(“PrintGRV”);
打破
案例“BPQRj”:
调用(“PrintGRV”,5);
场景管理器。加载场景(“PrintGRV”);
打破
案例“SPQRj”:
调用(“PrintGRV”,5);
场景管理器。加载场景(“PrintGRV”);
打破
}
}

这取决于您需要等待的时间和内容。。。如果您想等待一个固定的时间延迟,您可以简单地使用

然后像这样运行它

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

如果您想等待某个其他异步方法完成,您也可以(例如)等待bool标志变为true,正如正确提到的DRACO18一样,您可以简单地使用


我还要注意的是,
waitill(()=>xyistone)
的作用与循环相同。@Draco18s你说得对,我总是忘记那个!
switch (mTrackableBehaviour.TrackableName)
{
    case "HLQRj":
        Invoke("PrintGRV", 5);
        StartCoroutine(SwitchScene());
        break;
    //...
}
private bool xyIsDone = false;

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

    SceneManager.LoadScene("PrintGRV");
}