unity-iPhoneX适配

iPhoneX适配,比较搓的一种方式,在不修改分辨率(720 x 1280)的情况下适配

iphone X 主屏尺寸: 5.8英寸 主屏分辨率: 2436 x 1125


核心代码

修改 工程目录/Classes/UnityAppController.mm 文件

判断的方式比较搓,以 iPhone X 的宽高的 与众不同来判断

为了不调整分辨率的情况下适配(这里是 竖屏 应用),高度改为 150 是最好的值。(横屏 应用修改 height 为 width,y为 x 即可)

  • 找到方法

    这里写图片描述

  • 代码

    //    _window         = [[UIWindow alloc] initWithFrame: [UIScreen mainScreen].bounds];
    
        CGRect winSize = [UIScreen mainScreen].bounds;
        if (winSize.size.height / winSize.size.width > 2) {
            winSize.size.height -= 150;
            winSize.origin.y = 75;
            ::printf("-> is iphonex hello world\n");
        } else {
            ::printf("-> is not iphonex hello world\n");
        }
        _window = [[UIWindow alloc] initWithFrame: winSize];
    
  • 运行效果

    这里写图片描述


自动化修改代码

不用每次打xcode后都需要手动修改

参考:https://www.cnblogs.com/pandawuwyj/p/6904770.html

  1. 增加一个修改 文件的类

    using UnityEngine;
    using System.Collections;
    using System.Collections.Generic;
    using System.IO;
    
    namespace UnityEditor.XCodeEditor
    {
       public partial class XClassExt : System.IDisposable
       {
    
           private string filePath;
    
           public XClassExt(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("\n", beginIndex + below.Length);
    
               text_all = text_all.Substring(0, endIndex) + "\n" + text + "\n" + 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()
           {
    
           }
       }
    }
    
  2. 打包后处理,动态修改 xcode配置 及 文件内容

    using System;
    using System.IO;
    using System.Collections.Generic;
    using UnityEditor;
    using UnityEngine;
    using UnityEditor.Callbacks;
    
    #if UNITY_EDITOR_OSX
    
    using UnityEditor.iOS.Xcode;
    using UnityEditor.XCodeEditor;
    
    #endif
    
    
    public class Package {
    
    
    #if UNITY_EDITOR_OSX
    
       [PostProcessBuildAttribute(100)]
       public static void OnPostProcessBuild(BuildTarget target, string pathToBuiltProject) {
           if (target != BuildTarget.iOS) {
               Debugger.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.height / winSize.size.width > 2) {
           winSize.size.height -= 150;
           winSize.origin.y = 75;
           ::printf(""-> is iphonex aaa hello world\n"");
       } else {
           ::printf(""-> is not iphonex aaa hello world\n"");
       }
       _window = [[UIWindow alloc] initWithFrame: winSize];
    
       ";
    
           string unityAppControllerPath = path + "/Classes/UnityAppController.mm";
           XClassExt UnityAppController = new XClassExt(unityAppControllerPath);
           UnityAppController.Replace(src, dst);
       }
    
    #endif
    
    }
    


参考资料

猜你喜欢

转载自blog.csdn.net/yangxuan0261/article/details/79403244