Unity 批量设置iOS本地插件编译标志

来源:互联网 发布:php订餐系统源码 编辑:程序博客网 时间:2024/06/06 01:16

原文地址


  [MenuItem("一键打包/设置 -fno-objc-arc")]    static void 设置编译标志()    {        SetCompileFlags("-fno-objc-arc");        Debug.Log("完成设置编译标志");    }    [MenuItem("一键打包/清除 -fno-objc-arc")]    static void 清除编译标志()    {        SetCompileFlags("");        Debug.Log("完成清除编译标志");    }    static void SetCompileFlags(string flags)    {        if (Selection.objects.Length != 1)        {            Debug.LogError("请选中一个文件夹或者文件");            return;        }        string assetPath = AssetDatabase.GetAssetPath(Selection.activeObject);        if(File.Exists(assetPath))            SetCompileFlags(assetPath, flags);        else        {            string[] includeExtensions = { ".m", ".mm", ".h" };            foreach (var file in Directory.GetFiles(assetPath, "*.*", SearchOption.AllDirectories).Where(path => includeExtensions.Contains(Path.GetExtension(path))))            {                SetCompileFlags(file.Replace(Application.dataPath, "Assets"), flags);            }        }    }    static void SetCompileFlags(string assetPath, string flags)    {        var pluginImporter = AssetImporter.GetAtPath(assetPath) as PluginImporter;        if (pluginImporter == null || !pluginImporter.GetCompatibleWithPlatform(BuildTarget.iOS))            return;        pluginImporter.SetPlatformData(BuildTarget.iOS, "CompileFlags", flags);        pluginImporter.SaveAndReimport();    }

为什么我会知道PluginImporter的存在?Unity的资源都有对应的AssetImporter。只需要反射出来取出来看看都有哪些就知道了。

        var type = typeof(AssetImporter);        Debug.Log(type + " 向下的继承链 : ");        IEnumerable<Type> types = type.Assembly.GetTypes().Where(item => type.IsAssignableFrom(item) && item != type);        foreach (Type t in types)            Debug.Log(t);


第二种方法:

原文地址

using UnityEngine;
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;
using System.IO;


public class PbxModifier
{


[PostProcessBuild]
public static void OnPostprocessBuild(BuildTargetbuildTarget, string path)


{
if (buildTarget == BuildTarget.iOS) 
{
string projPath = path + "/Unity-iPhone.xcodeproj/project.pbxproj";


PBXProject proj = new PBXProject();
proj.ReadFromString(File.ReadAllText(projPath));


string target = proj.TargetGuidByName("Unity-iPhone");
string file = proj.FindFileGuidByProjectPath("Classes/UnityAppController.mm");


var flags = proj.GetCompileFlagsForFile(target, file);
flags.Add("-fno-objc-arc");
proj.SetCompileFlagsForFile(target, file, flags);


File.WriteAllText(projPath, proj.WriteToString());
}
}
}

原创粉丝点击