Unity Google iOS 上的 Cardboard 显示问题
Unity Google Cardboard display issue on iOS
我以前从未遇到过这样的问题,我尝试解决的所有问题都没有成功。
我们有一个应用程序使用 Unity 的内置 Google Cardboard 支持,我们在 Android 和 iOS 上可用。该问题以前从未出现在 Android 上,也没有出现在我们使用相同版本的 Unity (2018.1.1) 创建的其他项目中。
在为每只眼睛配置单独的视口时,它似乎以某种方式变得混乱。纵横比已被垂直压缩并拉伸显示的图像。最重要的是,左眼和右眼似乎正对着一个斗鸡眼的庄园,他们应该或多或少地朝向同一个方向。这是代表问题的图像,在每只眼睛的当前显示区域周围画了一条线:
iOS cardboard display
这张照片是 iPhone 6 的,但是它已被复制到多个设备上,包括 iPhone 8、iPhone X 和其他一些我不记得了。就像我之前提到的,这从未在 Android 上发生过,也没有出现在类似设置项目的 iOS 上。
我怀疑它与我的 Unity 场景的设置方式有关,所以我将简要说明目前的工作原理。
场景 1 - 菜单场景
这是一个完全基于 UI 的场景(与大多数菜单一样),并且在人像中设置。它有一个保持在标准模式(非 VR)的主摄像头。
场景2-体验场景
此场景使用代码 Screen.orientation = ScreenOrientation.Landscape
切换到横向视图。它在场景中有 一个 摄像机,最初处于标准模式(非 VR),但可以使用带有以下代码的按钮切换到 VR:
public void SetStereoViewState(bool isActive) {
XRSettings.enabled = isActive;
#if !UNITY_EDITOR
// if device is a tablet (> 7" screen) always disable cardboard switch
// otherwise display only when cardboard mode is inactive
overlayCanvas.gameObject.SetActive(ScreenUtils.IsTabletDevice ? false : !isActive);
// needed to fix the aspect ratio when switching back to mono mode
vrCamera.ResetAspect();
#endif
Debug.Log("XRManager::SetStereoViewState | Enabling VR: " + isActive);
}
在此应用程序的先前版本 (运行 Unity 2017.2.0p2) 中,这从来都不是问题,在同样于 2018.1.1 中创建的单独项目中也不是问题。
到目前为止我已经尝试过什么
camera.ResetAspect()
- 这是为了解决从 VR 切换到非 VR 时的方面问题。在切换 VR -> 非 VR、非 VR -> VR 等各种方式时,我已经启用和禁用了它。我也将它延迟到下一帧,但结果没有任何变化
- 在景观场景中启用 'Cardboard' 模式 - 我过去一直设置场景的方式是在启动时
XRSettings.LoadDeviceByName({device_name})
,在这种情况下 XRSettings.LoadDeviceByName("cardboard")
但不启用它与 XRDevice.enabled = true
直到实际需要它。 | VR XRDevice.enabled = true
- 非 VR XRDevice.enabled = false
相机设置
我认为这无关紧要,因为 VR 在 Android 上运行得非常好,但这是我的默认相机设置:
Unity camera setup
我考虑过设置多个摄像头(左眼和右眼),但我看不出这会有什么不同,因为宽高比是问题之一。
如果有人遇到过类似的问题并有解决办法,或者对如何以不同的方式处理这种情况有任何建议,那就太棒了。
注意:
目前我们使用的是 Unity 2018.1.1,但我也尝试过最新的(当时)2018.1.5。降级到 2017.x.x 不太可能是因为 HttpWebRequests 和 Apple 有点令人沮丧的 IPv6 要求,直到 Unity 2018.x.x
固定
问题是在纵向加载 'cardboard' 模式时出现的。这是我 运行 在应用启动时用来解决问题的代码:
private IEnumerator SetupCardboard() {
Screen.orientation = ScreenOrientation.Landscape;
XRSettings.LoadDeviceByName("cardboard");
yield return null;
Screen.orientation = ScreenOrientation.Portrait;
}
我以前从未遇到过这样的问题,我尝试解决的所有问题都没有成功。
我们有一个应用程序使用 Unity 的内置 Google Cardboard 支持,我们在 Android 和 iOS 上可用。该问题以前从未出现在 Android 上,也没有出现在我们使用相同版本的 Unity (2018.1.1) 创建的其他项目中。
在为每只眼睛配置单独的视口时,它似乎以某种方式变得混乱。纵横比已被垂直压缩并拉伸显示的图像。最重要的是,左眼和右眼似乎正对着一个斗鸡眼的庄园,他们应该或多或少地朝向同一个方向。这是代表问题的图像,在每只眼睛的当前显示区域周围画了一条线: iOS cardboard display
这张照片是 iPhone 6 的,但是它已被复制到多个设备上,包括 iPhone 8、iPhone X 和其他一些我不记得了。就像我之前提到的,这从未在 Android 上发生过,也没有出现在类似设置项目的 iOS 上。
我怀疑它与我的 Unity 场景的设置方式有关,所以我将简要说明目前的工作原理。
场景 1 - 菜单场景 这是一个完全基于 UI 的场景(与大多数菜单一样),并且在人像中设置。它有一个保持在标准模式(非 VR)的主摄像头。
场景2-体验场景
此场景使用代码 Screen.orientation = ScreenOrientation.Landscape
切换到横向视图。它在场景中有 一个 摄像机,最初处于标准模式(非 VR),但可以使用带有以下代码的按钮切换到 VR:
public void SetStereoViewState(bool isActive) {
XRSettings.enabled = isActive;
#if !UNITY_EDITOR
// if device is a tablet (> 7" screen) always disable cardboard switch
// otherwise display only when cardboard mode is inactive
overlayCanvas.gameObject.SetActive(ScreenUtils.IsTabletDevice ? false : !isActive);
// needed to fix the aspect ratio when switching back to mono mode
vrCamera.ResetAspect();
#endif
Debug.Log("XRManager::SetStereoViewState | Enabling VR: " + isActive);
}
在此应用程序的先前版本 (运行 Unity 2017.2.0p2) 中,这从来都不是问题,在同样于 2018.1.1 中创建的单独项目中也不是问题。
到目前为止我已经尝试过什么
camera.ResetAspect()
- 这是为了解决从 VR 切换到非 VR 时的方面问题。在切换 VR -> 非 VR、非 VR -> VR 等各种方式时,我已经启用和禁用了它。我也将它延迟到下一帧,但结果没有任何变化- 在景观场景中启用 'Cardboard' 模式 - 我过去一直设置场景的方式是在启动时
XRSettings.LoadDeviceByName({device_name})
,在这种情况下XRSettings.LoadDeviceByName("cardboard")
但不启用它与XRDevice.enabled = true
直到实际需要它。 | VRXRDevice.enabled = true
- 非 VRXRDevice.enabled = false
相机设置 我认为这无关紧要,因为 VR 在 Android 上运行得非常好,但这是我的默认相机设置: Unity camera setup
我考虑过设置多个摄像头(左眼和右眼),但我看不出这会有什么不同,因为宽高比是问题之一。 如果有人遇到过类似的问题并有解决办法,或者对如何以不同的方式处理这种情况有任何建议,那就太棒了。
注意: 目前我们使用的是 Unity 2018.1.1,但我也尝试过最新的(当时)2018.1.5。降级到 2017.x.x 不太可能是因为 HttpWebRequests 和 Apple 有点令人沮丧的 IPv6 要求,直到 Unity 2018.x.x
固定
问题是在纵向加载 'cardboard' 模式时出现的。这是我 运行 在应用启动时用来解决问题的代码:
private IEnumerator SetupCardboard() {
Screen.orientation = ScreenOrientation.Landscape;
XRSettings.LoadDeviceByName("cardboard");
yield return null;
Screen.orientation = ScreenOrientation.Portrait;
}