使用Google ARCore,当我在游戏中构建时,我有一个重启按钮来清除场景并重新启动关卡。我是通过使用Scenemanager.LoadScene()
重新加载场景来做到这一点的,但是当场景重新加载时,相机没有初始化,只显示一个蓝屏,我的UI在顶部。
我可以在代码中使用哪些东西来确保在重新加载场景时不会发生这种情况吗?
答案 0 :(得分:1)
在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;
希望这会有所帮助。
答案 1 :(得分:0)
对于那些在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);
希望这会有所帮助。