如何在 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 进行测试时 运行 无效。
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 进行测试时 运行 无效。