当你提交你的应用给Oculus时,你提供应用和必要的元数据来将它列于Oculus商店和从Oculus Home启动它。
一旦从oculus Home启动,你需要写一个循环来监听回话状态。ovr_GetSessionStatus返回一个结构体带有下面的布尔值:
。ShouldQuit--true如果应用应该初始化关闭。
。HmdPresent--true--如果呈现一个HMD。
。DisplayLost--true如果HMD没有被插入或者显示器驱动手动关闭的或遭遇一个TDR。
。HmdMounted--true如果HMD在用户头上。
。IsVisible--true如果游戏或体验有VR焦点和可见的在HMD中。
。ShouldRecenter--true如果应用应该调用ovr_RecenterTrackingOrigin.它被触发当用户初始化重定位通过Universal菜单。
管理用户退出
如果ShouldQuit是真,保存应用的状态和关闭或者关闭不保存应用状态。用户会自动返回到oculus Home.
依赖应用的类型,你能提示用户开始在他或她离开的地方或者你只从头开始体验。如果这是一个多玩家游戏,你可能希望退出本地而不关闭游戏。
管理用户请求重定位
如果ShouldRecenter是真,应用应该调用ovr_RecenterTrackingOrigin和为追踪位置做准备基于一个不同的原点。
一些应用可以有原因去忽略请求或实现它经由一个内部的机制除了通过ovr_RecenterTrackingOrigin。在这些情景下应用能调用ovr_ClearShouldRecenterFlag来清楚重定位请求。
管理未插入的头戴
如果DisplayLost是真:
1.暂停应用,包括音频。
2.显示一个提示在监视器上来说明头戴没有被插入。
3.销毁任何TextureSwapChains或者错误纹理。
4.调用ovrDestroy。
5.监听ovrSessionStatus::HmdPresent直到为真。
6.调用ovrCreate来重建回话。
7.重建任何TextureSwapChains或错误纹理。
8.恢复应用。
如果ovrDetect没有返回真在一个指定的时间后,ShouldQuit返回真。如果用户没有采取行动在一个指定的时间后,选择一个默认动作和关闭应用。
注意:多玩家游戏,你可能希望采用下面处理而不暂停游戏。
管理一个无效的头戴
当一个用户摘掉头戴或如果你的应用有VR焦点时,HmdMounted或IsVisible返回假。暂停应用直到它们返回真。
当你的应用失去VR焦点,它自动停止接受输入。如果你的应用没有使用Oculus输入API,它需要忽略任何接收的输入。
注意:多用户游戏,你可能希望游戏继续而不暂停。
管理窗口焦点的丢失
当你的应用失去窗口焦点,Oculus远程,Xbox控制器和触摸控制器会已经正常工作。然而,应用会失去鼠标和键盘的控制。
如果你的应用失去窗口焦点和维持VR焦点,继续处理输入和允许应用正常运行。如果键盘和鼠标需要继续,提示用户摘掉头戴和使用Alt-Tab来重获取窗口焦点。
代码示例
bool shouldQuit = false; void RunApplication() { ovrResult result = ovr_Initialize(); if (OVR_SUCCESS(result)) { ovrSession session; ovrGraphicsLuid luid; result = ovr_Create(&session, &luid); if (OVR_SUCCESS(result)) { ovrSessionStatus ss; <create graphics device with luid> <create render target via ovr_CreateTextureSwapChain> while (!shouldQuit) { <get next frame pose, e.g. via ovr_GetEyePoses> <render frame> result = ovr_SubmitFrame(...); if (result == ovrSuccess_NotVisible) { <turn off audio output> do { // Wait until we regain visibility or should quit <sleep> result = ovr_GetSessionStatus(session, &ss); if (ss.ShouldQuit) shouldQuit = true; } while (OVR_SUCCESS(result) && !ss.IsVisible && !shouldQuit); <possibly re-enable audio> } else if (result == ovrError_DisplayLost) { // We can either immediately quit or do the following: <destroy render target and graphics device> ovr_Destroy(session); do { // Spin while trying to recreate session. result = ovr_Create(&session, &luid); } while (OVR_FAILURE(result) && !shouldQuit); if (OVR_SUCCESS(result)) { <recreate graphics device with luid> <recreate render target via ovr_CreateTextureSwapChain> } } else if (OVR_FAILURE(result)) { shouldQuit = true; } ovr_GetSessionStatus(session, &ss); if (ss.ShouldQuit) shouldQuit = true; if (ss.ShouldRecenter) { ovr_RecenterTrackingOrigin(session); // or ovr_ClearShouldRecenterFlag(session) to ignore the request. <do anything else needed to handle this> } } <destroy render target via ovr_DestroyTextureSwapChain> <destroy graphics device> ovr_Destroy(session); } ovr_Shutdown(); } }