c# - iOS 上的 Unity Google Cardboard 显示问题

标签 c# ios unity-game-engine google-cardboard

我以前从未遇到过这样的问题,我尝试解决的所有问题都没有成功。

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

在为每只眼睛配置单独的视口(viewport)时,它似乎以某种方式变得困惑。纵横比已被垂直压缩并拉伸(stretch)显示的图像。最重要的是,左眼和右眼似乎正对着一个斗鸡眼的庄园,他们应该或多或少地朝向同一个方向。这是代表问题的图像,在每只眼睛的当前显示区域周围画了一条线: iOS cardboard display

这张照片是 iPhone 6 的照片,但它已被复制到多个设备上,包括 iPhone 8、iPhone X 和其他一些我记不起的设备。正如我之前提到的,这在 Android 上从未发生过,也没有出现在 iOS 上的类似设置项目中。

我怀疑它与我的 Unity 场景的设置方式有关,所以我将简要说明一下目前的工作方式。

场景 1 - 菜单场景 这是一个完全基于 UI 的场景(像大多数菜单一样),并在人像中设置。它有一个保持在标准模式(非 VR)的主摄像头。

场景2——体验场景 此场景使用代码 Screen.orientation = ScreenOrientation.Landscape 切换到横向 View 。它在场景中有一个一个摄像机,最初处于标准模式(非 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 等各种方式时启用和禁用了此功能。我也将此延迟到下一帧,但结果没有任何变化
  • 在 Landscape 场景中启用“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 才被打破

最佳答案

已修复

问题是在纵向模式下加载“纸板”模式时。这是我在应用启动时运行的代码,用于解决问题:

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

关于c# - iOS 上的 Unity Google Cardboard 显示问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51014663/

相关文章:

c# - 使用 Visual Studio 速成版有什么缺点?

c# - MonoTouch - 无法加载 bundle : 'NSBundle' 中的 NIB

c# - 在 C# 中按 block 读取文本文件的最佳方法

php - 通过来自 iOS 的 http post 请求在 php 中接收图像

unity-game-engine - 如何通过 Unity 编辑器脚本强制构建过程失败?

unity-game-engine - 一个 Unity 实例,两个 Unity 窗口?

C#-BackgroundWorker不断更新控件: Error!

ios - 如何删除所有注释图钉然后添加一个新图钉

ios - 关闭呈现的 UIViewController 时应用程序偶尔崩溃

firebase - Unity 和 Firebase - 程序包管理器解析程序,正在卸载以下程序包 : Firebase Authentication