Unity打包Ios DDS格式文件的处理

问题

有时项目里的美术资源会引用很多的DDS格式的图片,这种格式在Android上是没问题的,等到打IOS ab包的时候就会报错,因为苹果不支持DDS格式,这时就要对项目里DDS格式的资源进行处理

打包出现的报错

当有dds格式的时候,打包ios就会报下面的报错

DXT3 compressed textures are not supported when publishing to iPhone
Assets/Res/Scene/bhd/Texture/floor.DDS

解决

  • 1:将floor.DDS转为其他格式(这里推荐使用Xnconvert来转换)非常方便,可以直接输出到原目录
  • 2: 由于项目有的材质球已经引用了floor.DDS直接将其删除那么就会出问题,材质球就会出现丢失,显然是不能这样做的,那么此时就需要找到哪些资源引用了floor.DDS,unity提供了一个方法AssetDatabase.GetDependencies(path)该方法会返回文件应用了那些资源,显然和我们的需求是相反的,那么我们就要找到项目中所有的DDS格式的图片,然后找到哪些材质球引用了该图片,重新设置材质球的Texture,这样才可以,代码如下
  • [MenuItem("Jenkins/一键替换DDS格式(需要选中Assets目录)")]

    private static void ReplaceAllDDS()
    {
        Dictionary<string, string> guidItems = new Dictionary<string, string>();
        Dictionary<string, string> guidItemPaths = new Dictionary<string, string>();
        EditorUtility.DisplayProgressBar("正在获取所有DDS图片", "", 0f);
        UnityEngine.Object[] m_objects = Selection.GetFiltered(typeof(Texture), SelectionMode.DeepAssets);//选择的所有对象        
        int allCount = m_objects.Length;
        int count = 0;
        foreach (UnityEngine.Object item in m_objects)
        {
            count = count + 1;
            float progress = (float)count / (float)allCount;
            string des = count.ToString() + "/" + allCount.ToString();
            EditorUtility.DisplayProgressBar("正在搜集DDS图片", des, progress);
            string assetPath = AssetDatabase.GetAssetPath(item);
            if (Path.GetExtension(assetPath) == ".dds")
            {
                string guid = AssetDatabase.AssetPathToGUID(assetPath);
                if (!guidItems.ContainsKey(guid))
                {
                    guidItems[guid] = item.name;
                    guidItemPaths[guid] = assetPath;
                }
            }
        }
        EditorUtility.ClearProgressBar();
        if (guidItems.Count > 0)
        {
            List<string> withoutExtensions = new List<string>() { ".mat" };
            string[] files = Directory.GetFiles(Application.dataPath, "*.*", SearchOption.AllDirectories).Where(s => withoutExtensions.Contains(Path.GetExtension(s).ToLower())).ToArray();
            for (int i = 0; i < files.Length; i++)
            {
                string file = files[i];
                if (i % 20 == 0)
                {
                    bool isCancel = EditorUtility.DisplayCancelableProgressBar("匹配检查中", file, (float)i / (float)files.Length);
                    if (isCancel)
                    {
                        break;
                    }
                }
                foreach (KeyValuePair<string, string> guidItem in guidItems)
                {
                    if (Regex.IsMatch(File.ReadAllText(file), guidItem.Key))
                    {
                        string ddsPath = guidItemPaths[guidItem.Key];
                        Debug.Log(string.Format("dds:{0} 引用的资源: {1}", ddsPath, file));
                        string assetPath = file.Substring(Application.dataPath.Length - 6).Replace(Path.DirectorySeparatorChar, '/');
                        Material s_materila = AssetDatabase.LoadAssetAtPath(assetPath, typeof(Material)) as Material;
                        if (s_materila)
                        {
                            string newTextruePath = ddsPath.Replace(".dds", ".png");
                            if (Path.GetExtension(newTextruePath) != "")//判断同目录下是否有同名.png文件
                            {
                                s_materila.mainTexture = AssetDatabase.LoadAssetAtPath<Texture>(newTextruePath);
                                //替换成功后删除.dds格式的贴图文件
                                AssetDatabase.DeleteAsset(ddsPath);
                                Debug.Log("替换dds完成:= " + s_materila.name);
                            }
                            else
                            {
                                Debug.LogError("同目录下没有找到png文件:= " + newTextruePath + "请使用Xnconvert进行转换");
                            }
                        }
                    }
                }
            }
            EditorUtility.ClearProgressBar();
        }
        //保存并刷新资源
        AssetDatabase.SaveAssets();
        AssetDatabase.Refresh();
    }

最后点击Jenkins/一键替换DDS格式(需要选中Assets目录)就大功告成了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,056评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,842评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,938评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,296评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,292评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,413评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,824评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,493评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,686评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,502评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,553评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,281评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,820评论 3 305
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,873评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,109评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,699评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,257评论 2 341