https://cloud.tencent.com/developer/article/1006131 这个写的特别详细~~
在网上找了很多有关Iphone X 适配的博文和教程..亲测时,都出现了不同的BUG...蛋疼,所以仅以此文..献给自己才过的坑..
1.首先创建一个Canvas 设置他的屏幕适配
我的是这样的..然后呢..随便创建一些图片 ,字体之类的..我的是这样适配的..大家随意发挥...
2.这个时候就可以自己随意打包了..记得拖入场景..然后设置一下
Player Setting 注意设置包名还有工程名..
3.打包出来的文件 寻找一下 : Classes -> UnityAppController.mm 并且打开它.
Commond + F 搜索 _window = [[UIWindow alloc] initWithFrame: [UIScreen mainScreen].bounds]; 找到这个..
修改如下操作 如图 :
// _window = [[UIWindow alloc] initWithFrame: [UIScreen mainScreen].bounds];
CGRect winSize = [UIScreen mainScreen].bounds;
if (winSize.size.width / winSize.size.height> 2) {
winSize.size.width -= 64;
winSize.origin.x = 32;
::printf("-> is iphonex ");
} else {
::printf("-> is not iphonex");
}
_window = [[UIWindow alloc] initWithFrame: winSize];
_unityView = [self createUnityView];
这个赋值替换一下就好了~..然后打包一下 就OK了 亲测有效...
这样操作太过于繁琐...那来点干货,简单一点的~参考至雨松MOMO大神的~~ http://www.xuanyusong.com/archives/2720
在Unity Asset目录下创建一个文件夹Editor(很重要的一步),并创建两个脚本: IPhoneXPackage, IphoneXClassExt
IphoneXClassExt 代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
namespace UnityEditor.XcodeEditor
{
public partial class IphoneXClassExt : System.IDisposable
{
private string filePath;
public IphoneXClassExt (string fPath)
{
filePath = fPath;
if (!System.IO.File.Exists (filePath)) {
Debug.LogError (filePath + "not found in path.");
return;
}
}
public void WriteBelow (string below, string text)
{
StreamReader streamReader = new StreamReader (filePath);
string text_all = streamReader.ReadToEnd ();
streamReader.Close ();
int beginIndex = text_all.IndexOf (below);
if (beginIndex == -1) {
Debug.LogError (filePath + " not found sign in " + below);
return;
}
int endIndex = text_all.LastIndexOf ("
", beginIndex + below.Length);
text_all = text_all.Substring (0, endIndex) + "
" + text + "
" + text_all.Substring (endIndex);
StreamWriter streamWriter = new StreamWriter (filePath);
streamWriter.Write (text_all);
streamWriter.Close ();
}
public void Replace (string below, string newText)
{
StreamReader streamReader = new StreamReader (filePath);
string text_all = streamReader.ReadToEnd ();
streamReader.Close ();
int beginIndex = text_all.IndexOf (below);
if (beginIndex == -1) {
Debug.LogError (filePath + " not found sign in " + below);
return;
}
text_all = text_all.Replace (below, newText);
StreamWriter streamWriter = new StreamWriter (filePath);
streamWriter.Write (text_all);
streamWriter.Close ();
}
public void Dispose ()
{
}
}
}
IPhoneXPackage代码如下:
using System.Collections;
using System.Collections.Generic;
using System;
using System.IO;
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEngine;
#if UNITY_EDITOR_OSX
using UnityEditor.iOS.Xcode;
using UnityEditor.XcodeEditor;
#endif
public class IPhoneXPackage : MonoBehaviour
{
#if UNITY_EDITOR_OSX
[PostProcessBuildAttribute (100)]
public static void OnPostProcessBuild (BuildTarget target, string pathToBuiltProject)
{
if (target != BuildTarget.iOS) {
Debug.LogWarning ("Target is not iPhone. XCodePostProcess will not run");
return;
}
// Create a new project object from build target
PBXProject project = new PBXProject ();
string configFilePath = PBXProject.GetPBXProjectPath (pathToBuiltProject);
project.ReadFromFile (configFilePath);
string targetGuid = project.TargetGuidByName ("Unity-iPhone");
string debug = project.BuildConfigByName (targetGuid, "Debug");
string release = project.BuildConfigByName (targetGuid, "Release");
project.AddBuildPropertyForConfig (debug, "CODE_SIGN_RESOURCE_RULES_PATH", "$(SDKROOT)/ResourceRules.plist");
project.AddBuildPropertyForConfig (release, "CODE_SIGN_RESOURCE_RULES_PATH", "$(SDKROOT)/ResourceRules.plist");
project.AddFrameworkToProject (targetGuid, "SystemConfiguration.framework", true);
project.AddFrameworkToProject (targetGuid, "Security.framework", true);
project.AddFrameworkToProject (targetGuid, "libz.tbd", true);
project.AddFrameworkToProject (targetGuid, "libc++.tbd", true);
project.SetBuildProperty (targetGuid, "ENABLE_BITCODE", "NO");
project.WriteToFile (configFilePath);
EditSuitIpXCode (pathToBuiltProject);
}
public static void EditSuitIpXCode (string path)
{
//插入代码
//读取UnityAppController.mm文件
string src = @"_window = [[UIWindow alloc] initWithFrame: [UIScreen mainScreen].bounds];";
string dst = @"// _window = [[UIWindow alloc] initWithFrame: [UIScreen mainScreen].bounds];
CGRect winSize = [UIScreen mainScreen].bounds;
if (winSize.size.width / winSize.size.height> 2) {
winSize.size.width -= 64;
winSize.origin.x = 32;
::printf(""-> is iphonex "");
} else {
::printf(""-> is not iphonex"");
}
_window = [[UIWindow alloc] initWithFrame: winSize];
";
string unityAppControllerPath = path + "/Classes/UnityAppController.mm";
IphoneXClassExt UnityAppController = new IphoneXClassExt (unityAppControllerPath);
UnityAppController.Replace (src, dst);
}
#endif
}
这个时候重新打包..再打开: Classes -> UnityAppController.mm 就会发现..已经写入...这个时候,导入你的IPhoneX 中吧...
效果: