2016-12-09 2 views
1

Unity3D имеет класс Screen с свойством ориентации, который позволяет принудительно ориентировать код, что позволяет вам иметь разные сцены с разными ориентациями (полезными в мини-играх).Как я могу заставить ориентацию для каждой сцены в Unity3D

Настройка этого прекрасно подходит для Android, но сбой в iOS. Что такое исправление?

+0

Если все остальное не удается, вы можете всегда поворачивать основную камеру на 90 градусов. – rutter

+0

@rutter Я не думаю, что это было бы хорошо для UI :) –

ответ

1

Проблема заключается в файле UnityViewControllerBaseiOS.mm, который генерируется во время сборки для iOS, имеет в нем утверждение, которое непреднамеренно предотвращает использование этого свойства. Можно создать класс пост-сборки, который запускается после создания файлов сборки iOS, которые могут сгенерировать сгенерированный код перед его компиляцией в XCode.

Просто создайте скрипт C# с именем iOSScreenOrientationFix.cs и вставьте следующий код - от this Unity3D forum post. Обратите внимание, что этот файл должен быть помещен в папку с именем Editor или в одну из ее подпапок.

using UnityEngine; 
using UnityEditor; 
using UnityEditor.Callbacks; 
using System.IO; 

namespace Holovis 
{ 
    public class iOSScreenOrientationFix : MonoBehaviour 
    { 
#if UNITY_CLOUD_BUILD 
    // This method is added in the Advanced Features Settings on UCB 
    // PostBuildProcessor.OnPostprocessBuildiOS 
    public static void OnPostprocessBuildiOS (string exportPath) 
    { 
     Debug.Log("OnPostprocessBuildiOS"); 
     ProcessPostBuild(BuildTarget.iPhone,exportPath); 
    } 
#endif 

     [PostProcessBuild] 
     public static void OnPostprocessBuild(BuildTarget buildTarget, string path) 
     { 
#if !UNITY_CLOUD_BUILD 
      ProcessPostBuild(buildTarget, path); 
#endif 
     } 

     private static void ProcessPostBuild(BuildTarget buildTarget, string path) 
     { 
      if (buildTarget == BuildTarget.iOS) 
      { 
#if !UNITY_CLOUD_BUILD 
       Debug.Log("Patching iOS to allow setting orientation"); 
#endif 
       string filePath = Path.Combine(path, "Classes"); 
       filePath = Path.Combine(filePath, "UI"); 
       filePath = Path.Combine(filePath, "UnityViewControllerBaseiOS.mm"); 

       Debug.Log("File Path for View Controller Class: " + filePath); 

       string classFile = File.ReadAllText(filePath); 

       string newClassFile = classFile.Replace("NSAssert(UnityShouldAutorotate()", "//NSAssert(UnityShouldAutorotate()"); 

       File.WriteAllText(filePath, newClassFile); 
      } 
     } 
    } 
} 

Вы можете установить его в сцене, прилагая следующий MonoBehaviour к объекту игры

using UnityEngine; 

namespace Holovis 
{ 
    public class SetDeviceOrientation : MonoBehaviour 
    { 
     public ScreenOrientation orientation = ScreenOrientation.AutoRotation; 

     void Awake() 
     { 
      Screen.orientation = orientation; 
     } 
    } 
} 

ПРИМЕЧАНИЕ: Установка Screen.orientation не имеет никакого эффекта при работе на рабочем столе, в редакторе Unity, или при тестировании с использованием Unity Remote.

Смежные вопросы