Unity3D有一个带有方向属性的Screen类,允许你在代码中强制定位,这样你就可以拥有不同方向的不同场景(在迷你游戏中很有用)。
设置此功能适用于Android但在iOS上崩溃。有什么问题?
答案 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
无效。