2016-12-09 101 views
1

Unity3D具有一個屏幕類,其中的方向屬性允許您強制在代碼中定位,從而讓您擁有不同方向的不同場景(適用於迷你遊戲)。如何在Unity3D中強制每個場景的方向

設置這適用於Android的罰款,但在iOS上崩潰。什麼是修復?

+0

如果一切都失敗了,您總是可以將主相機旋轉90度。 – rutter

+0

@rutter我不認爲這會對UI有好處:) –

回答

1

問題是在構建期間爲iOS創建的文件UnityViewControllerBaseiOS.mm有一個斷言,它無意中阻止了該屬性的使用。可以創建一個後生成類,在生成iOS構建文件後運行,這些文件可以在XCode中編譯之前更改生成的代碼。

只需創建一個名爲iOSScreenOrientationFix.cs的C#腳本並粘貼以下代碼 - 從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; 
     } 
    } 
} 

注:在桌面上運行時,在Unity編輯設置Screen.orientation沒有效果,或者使用Unity Remote進行測試時。

相關問題