0

我有一个使用 Vuforia AR 库的统一应用程序。我用一些 iOs 代码扩展了这个应用程序。我希望有时能够显示我的自定义 UIViewControllers 而不是 Unity 使用的主视图控制器。但我希望能够切换回来。即:我有一个按钮可以打开带有“关于应用程序”信息的 UIViewController,然后该控制器具有“退出”按钮以返回 Unity 控制器。

这是我添加新控制器而不是 Unity 视图控制器的代码:

self.unityRootController = self.keyWindow.rootViewController; // keep reference to the Unity Controller
self.keyWindow.rootViewController = controller; // display my own controller

// this pauses the unity and qcar -> so that QCAR doesn't try to recognize objects, when Unity Controller is not up
QCARUnityPlayer::getInstance().QCARPause(true);
UnityPause(true);

然后从我自己的控制器返回到 Unity 控制器时:

self.keyWindow.rootViewController = self.unityRootController; // return to Unity Controller

// start tracking with QCAR and unpause Unity View
QCARUnityPlayer::getInstance().QCARPause(false);
UnityPause(NO);

这很好用,除了一种情况,这导致我自从遇到它就拉扯我的头发。我的应用程序支持在 Unity 和 ObjectiveC 代码中更改屏幕方向。这就是麻烦:如果我在设备处于纵向时打开我的视图控制器,然后将设备转到横向,我的控制器会正确旋转。但是如果我此时想要关闭我的自定义视图控制器并返回统一控制器,屏幕会突然变黑。将设备旋转到纵向后,统一控制器突然开始按预期工作。

我希望统一控制器在关闭我的自定义视图控制器后直接启动,即使屏幕方向发生了变化。我想我必须在这里重新启动 Unity Player 后添加一些代码:

QCARUnityPlayer::getInstance().QCARPause(false);
UnityPause(NO);
// TODO: supposedly some code should go here, that fixes black screen

但我试图在 AppController.mm 中找到一些由 Unity 构建的东西,但我找不到任何对我有帮助的东西。我发现了几行统一代码,其中包含“方向”一词,但我尝试使用该代码并没有帮助。有谁知道,请问我该怎么办?非常感谢:)

4

1 回答 1

4

不确定您是否已解决此问题,已经有一段时间了...但是 UnityViewController 无法正常运行的原因是因为不可见的视图控制器将不会接收旋转事件。因为您将视图控制器设置为根视图控制器,所以“iPhone_View.mm”中定义的 UnityDefaultViewController 不会接收旋转事件。

我一直在研究 Unity 的轮换,因为我有类似设置的问题。

您可以尝试以下几件事:

  1. 在 iPhone_View.mm 中定义了一个名为:UpdateOrientationFromController(UIViewController* controller) 的函数,它可能能够解决您的问题。您可能希望在您自己设计的视图控制器上调用此函数,该控制器放置您的 //TODO 注释。该函数调用了一些处理 Unity 界面方向的关键函数和方法:

    • ConvertToUnityScreenOrientation:出于某种原因 Unity 使用自己定义的屏幕方向,这在内部将方向转换为 Unity 使用的方向。
    • QCARUnityPlayer::getInstance().QCARSetOrientation(): QCAR 也需要设置它的方向
    • UnitySetScreenOrientation(_curOrientation):unity 库有一个内部方法来检查每个渲染帧的屏幕方向。我认为这个函数为 Unity View 设置了一个内部标志,以检查 iPhone_View.h 中定义的 CheckOrientationRequest()。
    • AppController_RenderPluginMethodWithArg 被调用,我不确定这是做什么的,但我认为它做了一些重要的事情
    • OrientTo(_curOrientation):这会启动实际的方向更改并处理正确的调用。这包括对 AppController 的 onForcedOrientation: 方法的调用,该方法执行最终方向。
  2. 使用 iPhone_OrientationSupport.h 中定义的 ConvertToUnityScreenOrientation() 将 UIDeviceOrientation 转换为 UnityScreen Orientation 后,您可以直接使用 UnityScreenOrientation 调用 AppController 的 onForcedOrientation: 方法。不过,您可能不想直接调用此方法,因为 Unity 的方向方法涉及到很多事情。当您的应用程序从呈现视图控制器返回时,您将执行此操作。

  3. 最后一件事,也是你可以做的“最棘手的事情”,它将完成工作,但不是以最有效的方式,将 UnityDefaultViewController 作为子 ViewController 添加到你的 ViewController 中,使用 addChildViewController: UIViewController Docs,或者也许作为一个属性,然后在 ViewController 中覆盖 willRotateToInterfaceOrientation:duration: 和 didRotateFromInterfaceOrientation: 并在调用 super 后将消息传递给 UnityDefaultViewController。这将导致 UnityDefaultViewController 在每次方向更改时更新 UnityView,即使视图实际上不可见。您可能需要也可能不需要取消暂停 Unity 才能使其正常工作。

在这三种方法中,最后一种肯定是可行的,因为我自己实现了。但是,第一个应该也可以工作,因为 Unity 多次使用它从启动屏幕检查设备的当前方向。

希望这可以帮助!

于 2014-03-29T01:38:24.527 回答