【问题标题】:Unity iOs - screen gets black when changing rotation while Unity is pausedUnity iOs - 在 Unity 暂停时更改旋转时屏幕变黑
【发布时间】:2013-09-06 08:30:38
【问题描述】:

我有一个使用 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 控制器突然开始按预期工作。

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

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

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

【问题讨论】:

    标签: ios objective-c unity3d screen-orientation qcar-sdk


    【解决方案1】:

    不确定您是否已解决此问题,已经有一段时间了...但是您的 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. 1234563 :UIViewController Docs,或者可能只是一个属性,然后在您的 ViewController 中覆盖 willRotateToInterfaceOrientation:duration: 和 didRotateFromInterfaceOrientation: 并在调用 super 后将消息传递给 UnityDefaultViewController。这将导致 UnityDefaultViewController 在每次方向更改时更新 UnityView,即使视图实际上不可见。您可能需要也可能不需要取消暂停 Unity 才能使其正常工作。

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

    希望这会有所帮助!

    【讨论】:

    • 您好,感谢您的意见。但是,我无法判断这是否解决了问题。这与我不再参与的一个项目有关。不过,我希望你能帮助其他有类似问题的人。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多