我有一个使用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播放器之后我必须添加一些代码:
QCARUnityPlayer::getInstance().QCARPause(false);
UnityPause(NO);
// TODO: supposedly some code should go here, that fixes black screen
但我试图在AppController.mm中找到一些东西,由Unity构建,我找不到任何东西,这对我有帮助。我发现几行统一代码,其中有“方向”一词,但我尝试使用该代码并没有帮助。有谁知道,我该怎么办?谢谢你们:)
答案 0 :(得分:3)
不确定你是否修复了它,它已经有一段时间......但是UnityViewController运行不正常的原因是因为不可见的视图控制器不会接收旋转事件。因为您将视图控制器设置为根视图控制器,所以“iPhone_View.mm”中定义的UnityDefaultViewController不会接收旋转事件。
我一直在研究Unity的旋转一段时间,因为我有类似设置的问题。
您可以尝试一些事项:
在iPhone_View.mm中有一个定义的函数叫做:UpdateOrientationFromController(UIViewController * controller),它可能能解决你的问题。您可能希望在您自己设计的视图控制器上调用此函数来放置// TODO注释。该函数调用了一些处理Unity接口方向的关键函数和方法:
在使用iPhone_OientientSupport.h中定义的ConvertToUnityScreenOrientation()将UIDeviceOrientation转换为UnityScreen方向后,您可以直接使用UnityScreenOrientation调用AppController的onForcedOrientation:方法。您可能不希望直接调用此方法,因为Unity的方向方法涉及很多内容。当您的应用从呈现视图控制器返回时,您将执行此操作。
最后一件事,以及你可以做的“最讨厌的事情”,将完成工作,但不是以最有效的方式,将UnityDefaultViewController添加到您的ViewController作为带有addChildViewController的子ViewController :UIViewController Docs,或者可能只是一个属性,然后覆盖willRotateToInterfaceOrientation:duration:和didRotateFromInterfaceOrientation:在ViewController中,在调用super之后,将消息传递给UnityDefaultViewController。这将导致UnityDefaultViewController在每次方向更改时更新UnityView,即使视图实际上不可见。您可能需要也可能不需要取消暂停Unity才能使其正常运行。
在这三种方法中,最后一种方法肯定有效,因为我自己实现了它。但是,第一个也应该可以工作,因为Unity会多次使用它来检查设备当前的方向,从启动画面开始。
希望这有帮助!