2016-12-09 1 views
1

Unity3D a une classe Screen avec une propriété d'orientation qui vous permet de forcer l'orientation dans le code, ce qui vous permet d'avoir différentes scènes avec des orientations différentes (utile dans les mini-jeux).Comment forcer une orientation par scène dans Unity3D

Cela fonctionne très bien pour Android, mais se bloque sur iOS. Quelle est la solution?

+0

Si tout le reste échoue, vous pouvez toujours faire pivoter l'appareil photo principal de 90 degrés. – rutter

+0

@rutter Je ne pense pas que ce serait bon pour l'interface utilisateur :) –

Répondre

1

Le problème est le fichier UnityViewControllerBaseiOS.mm qui est généré lors de la construction pour iOS a une assertion qui empêche par inadvertance l'utilisation de cette propriété. Il est possible de créer une classe de post-construction qui s'exécute après la génération des fichiers de construction iOS qui peuvent modifier le code généré avant de le compiler dans XCode.

Il suffit de créer un script C# nommé iOSScreenOrientationFix.cs et de le coller dans le code suivant - adapté de this Unity3D forum post. Notez que ce fichier doit être placé dans un dossier nommé Editor ou dans l'un de ses sous-dossiers.

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); 
      } 
     } 
    } 
} 

Vous pouvez le mettre dans une scène en attachant les éléments suivants MonoBehaviour à un objet de jeu

using UnityEngine; 

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

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

REMARQUE: Réglage Screen.orientation n'a pas d'effet lors de l'exécution sur le bureau, dans l'éditeur Unity, ou lors du test en utilisant Unity Remote.