我正在创建一个将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;
}
}
答案 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");
}