如何在 Unity3D 中强制每个场景的方向

How can I force an orientation per scene in Unity3D

Unity3D 有一个带有方向 属性 的屏幕 class,允许您在代码中强制方向,这让您可以拥有不同方向的不同场景(在迷你游戏中很有用)。

此设置在 Android 上工作正常,但在 iOS 上崩溃。解决方法是什么?

问题是在为 iOS 构建期间生成的文件 UnityViewControllerBaseiOS.mm 中有一个断言,无意中阻止了此 属性 的使用。可以创建一个 post-build class,它在 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;
        }
    }
}

注意: 设置 Screen.orientation 在桌面上、Unity 编辑器中或使用 Unity Remote 进行测试时 运行 无效。