美文网首页
Unity打包Ios DDS格式文件的处理

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

作者: 飞翔的蜗牛235 | 来源:发表于2020-10-16 14:35 被阅读0次

问题

有时项目里的美术资源会引用很多的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目录)就大功告成了

相关文章

网友评论

      本文标题:Unity打包Ios DDS格式文件的处理

      本文链接:https://www.haomeiwen.com/subject/jumzpktx.html