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