[英]ARCore session is not restarting
使用 Google ARCore,当我在我构建的游戏中时,我有一个重新启动按钮来清除场景并重新启动关卡。 我是通过使用Scenemanager.LoadScene()
重新加载场景来做到这一点的,但是当场景重新加载时,相机没有初始化,只是显示一个蓝屏,我的 UI 位于顶部。
我可以在代码中使用什么来确保在重新加载场景时不会发生这种情况?
在ARCore NDK中,您将使用以下方法破坏会话并释放其资源:
void ArSession_destroy(
ArSession *session
)
此方法释放ARCore会话使用的资源。 这将需要几秒钟才能完成。 为了防止阻塞主线程,调用ArSession_pause()
在主线程上,然后呼叫ArSession_destroy()
在后台线程 。
然后,您必须使用创建一个新会话:
ArSession_create()
另外, 在ARCore Android中 , 当前会话通常具有onPause()
和onResume()
方法。 但是我使用了另外两个: pause()
用于暂停当前会话, resume()
用于启动或恢复ARCore当前会话。
在Unity中,您应根据自己的目的尝试DestroyImmediate(session)
或Destroy(session)
。
ARCoreSession session = goARCoreDevice.GetComponent<ARCoreSession>();
ARCoreSessionConfig myConfig = session.SessionConfig;
DestroyImmediate(session);
// Destroy(session);
yield return null;
session = goARCoreDevice.AddComponent<ARCoreSession>();
session.SessionConfig = myConfig;
session.enabled = true;
希望这可以帮助。
对于那些在android studio中遇到与ARCore有关的问题,为了解决此问题,我使用了替换片段而不是重新启动整个Activity的简单解决方法。
过程:我正在动态添加ArFragment,当用户按下刷新按钮时,我将替换整个片段。
1-动态添加片段:
getSupportFragmentManager()
.beginTransaction()
.add(R.id.container, new MainARFragment())
.addToBackStack(null)
.commit();
2-这是我的刷新按钮代码:
refreshButton.setOnClickListener(view -> {
//refresh everything remove models and detect from start
getSupportFragmentManager().beginTransaction()
.replace(R.id.container, new MainARFragment()).commit();
});
一切正常,但是当我在将其添加到onCreate方法中后尝试查找FragmentById时,出现了空指针异常。 为了避免这种情况,请使用ArFragment中的Callback,并在ArFragment的onAttach中调用onComplete方法,然后使用:
arFragment = (MainARFragment) getSupportFragmentManager().findFragmentById(R.id.container);
希望这会有所帮助。
@Nouman Ch
根据您的方法,该片段已成功替换,但是我遇到了一个新问题。 onupdatelistener未更新,并且重新启动会话后无法获取相机姿态。 您如何理解答案中的“请在配置中使用回调”一句? 我不知道该怎么用。 我在stackflow中询问问题,但没人回答我。 点击这里获取详细信息
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.