iOS上的Unity Google Cardboard显示问题

时间:2018-06-24 23:06:45

标签: c# ios unity3d google-cardboard

我以前从未遇到过这样的问题,而我试图解决的所有问题都没有实现。

我们有一个使用Unity内置的Google Cardboard支持的应用程序,该应用程序已在Android和iOS上提供。该问题以前从未在Android上出现过,也没有出现在我们使用相同版本的Unity(2018.1.1)创建的其他项目中。

为每只眼睛配置单独的视口时,似乎有些困惑。纵横比已经垂直压缩,并且正在拉伸显示的图像。最重要的是,左眼和右眼似乎正面对着交叉眼睛的庄园,在这里他们应该朝着相同的方向或多或少地面对。这是代表问题的图像,在每只眼睛的当前显示区域周围绘制了一条线: iOS cardboard display

这张照片是iPhone 6的照片,但是已经在包括iPhone 8,iPhone X以及我不记得的其他一些设备上复制了。就像我之前提到的那样,这在Android上从未发生过,也没有在iOS的类似安装项目中出现。

我怀疑这与Unity场景的设置方式有关,因此我将简要介绍一下目前的工作方式。

场景1-菜单场景 这是一个完全基于UI的场景(与大多数菜单一样),并在Portrait中进行了设置。它的主摄像头仍处于标准模式(非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等时启用和禁用了此功能。我也将其延迟到下一帧,但结果没有任何改变
  • 在“风景”场景中启用“纸板”模式-我过去一直设置场景的方式是在启动时使用XRSettings.LoadDeviceByName({device_name}),在本例中为XRSettings.LoadDeviceByName("cardboard"),但不使用{{ 1}},直到真正需要它为止。 | VR XRDevice.enabled = true-非VR XRDevice.enabled = true

相机设置 我认为这无关紧要,因为VR可以在Android上完美运行,但这是我设置的默认摄像头: Unity camera setup

我已经考虑过设置多个摄像头(左眼和右眼),但是由于纵横比是问题之一,因此我看不到这会产生什么影响。 如果有人遇到过类似的问题并且有解决方案,或者对如何以一种很棒的方式处理这种情况有任何建议,那么。

注意: 当前,我们正在使用Unity 2018.1.1,但我也尝试了最新(当时)的2018.1.5。降级到2017.x.x的可能性不大可能是由于HttpWebRequests和苹果公司一些令人沮丧的IPv6要求,这些要求直到Unity 2018.x.x才被取消。

1 个答案:

答案 0 :(得分:1)

已修复

问题是在人像模式下加载“纸板”模式时。这是我在应用启动时运行以解决此问题的代码:

private IEnumerator SetupCardboard() {
    Screen.orientation = ScreenOrientation.Landscape;
    XRSettings.LoadDeviceByName("cardboard");
    yield return null;
    Screen.orientation = ScreenOrientation.Portrait;
}