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

时间:2016-12-09 17:00:18

标签: unity3d orientation scene

Unity3D有一个带有方向属性的Screen类,允许你在代码中强制定位,这样你就可以拥有不同方向的不同场景(在迷你游戏中很有用)。

设置此功能适用于Android但在iOS上崩溃。有什么问题?

1 个答案:

答案 0 :(得分: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编辑器或使用Unity Remote进行测试时,设置Screen.orientation无效。