真Unity3d_分享一个设置纹理压缩的工具

 

某大公司,大游戏的一些代码,但是没怎么用上,都扔角落里了

下面信息量很多,但其实关键就是那2行代码:

        Object[] objs = Selection.objects;
        foreach (var obj in objs)
        {

            TextureImporter importer = AssetImporter.GetAtPath(AssetDatabase.GetAssetPath(obj.GetInstanceID())) as TextureImporter;
            importer.textureCompression = TextureImporterCompression.CompressedHQ;
            importer.SaveAndReimport();
        }

 其中,importer.SaveAndReimport();对于批量处理,很费时,可以不调用,我用的Unity5.6.6试过,

很久很久之前,我吐槽过某大V,在资源加载的实现逻辑,连File.Exists的判断都不会(现在那大V已经很成熟了,博客备注清晰且准确就,人总是会进步的,只要你比50%的人努力)

现在我吐槽下自己吧,反正如果在Editor处理的情况下,做这样的判断,反而是多余的,直接报错即可,很烂的代码真的不要复制,粘贴

        string assetPath_UI = relative_path;
        if (!Directory.Exists(assetPath_UI))
        {
            Debug.Log((object)assetPath_UI);
        }
        else
        {
            DirectoryInfo directoryInfo = new DirectoryInfo(Application.dataPath + "/" + relative_path);
            DirectoryInfo[] dirs = directoryInfo.GetDirectories();
            foreach (var dir in dirs)
            {
                foreach(var child in dir.GetDirectories())
                {
                    Debug.Log("chidl"+child.FullName);
                }
                
            }

        }

上面的File.Exists 在这种编辑器情况下,判断反而是多余的,总结就是具体实现看实际情况吧,一个方案,仅仅只是在某些特定情况下,能发挥出作用,换了个前设,或者大环境,本来好用的方案甚至可以放到最后考虑,或者不予考虑

最后,我前面也说了“某大公司,大游戏的一些代码,但是没怎么用上,都扔角落里了”,扔角落里,就真的因为写的很烂,没有递归,没有回调,没法看,下面代码不用看了(但确实有某些行业经验值得借鉴)

之后我再写一个完整的简单版:《后补》

改变看得见

 反正搞完所有资源,搞了一大轮,最后减少了3M,3M很多了。

确实如官方所说,最高质量的压缩,在PC版本采用 BC7,而最低版本就采用 DirectX的DXT1

 然并卵,

在项目中你喜欢就按这样压缩一下吧,聊胜于无

 

参考:

某大V的Texture旧的处理代码:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using UnityEditor;
using UnityEngine.UI;
using System.Text;

public class IconSortOut {


    //路径  
    public static string fullPath = "Assets/ResPack/UI/Icon";  //路径
    public static string constDirName = "/ResPack/UI/";

    [MenuItem("UI工具/图片整理/ICon分类整理", false, 4000)]
    public static void IconStart()
    {
        //路径  
        //string fullPath = "Assets/ResPack/UI/Icon";  //路径
        //获取指定路径下面的所有资源文件  
        if (Directory.Exists(fullPath))
        {
            DirectoryInfo direction = new DirectoryInfo(fullPath);
            FileInfo[] files = direction.GetFiles("*", SearchOption.AllDirectories);

            Debug.Log(files.Length);

            for (int i = 0; i < files.Length; i++)
            {
                //if (files[i].Name.EndsWith(".meta"))
                //{
                //    continue;
                //}
                if (files[i].Name.StartsWith("icon_item"))
                { 
                    MoveFiles(files[i], "item");
                }
                else if (files[i].Name.StartsWith("image") ||files[i].Name.StartsWith("Image"))
                {
                    MoveFiles(files[i], "image");
                }
                else if ((files[i].Name.StartsWith("icon_") || files[i].Name.StartsWith("Icon_")) && !(files[i].Name.StartsWith("icon_item")))
                {
                    MoveFiles(files[i], "normal");
                }
                //else
                //{
                //    //留在icon内
                //} 
            }
        }
    }

    public static void MoveFiles(FileInfo file,string name)
    {
        
        string directoryName = "Assets/ResPack/UI/Icon_"+ name;  //路径
     
        if (!Directory.Exists(directoryName))
        {
            //Directory.CreateDirectory(Application.dataPath.Replace("Assets", "") + directoryName);
            AssetDatabase.CreateFolder("Assets/ResPack/UI", "Icon_"+ name);
        }
        string ret = AssetDatabase.MoveAsset(fullPath+"/"+ file.Name, directoryName+"/"+file.Name); //移动资源
        Debug.Log(ret);
    }

    
    [MenuItem("UI工具/图片整理/选择文件夹整理256宽度NewSprite到TextTure", false, 4000)]
    public static void MoveSprite()
    {
        if (Selection.objects.Length != 1)
        {
            Debug.LogError((object) "选择一个文件夹");
        }
        else
        {
            string assetPath = AssetDatabase.GetAssetPath(Selection.objects[0]);
            if (!Directory.Exists(assetPath))
            {
                Debug.Log((object) assetPath);
            }
            else
            {
                LoadImageHistoryInit();
                //AssetDatabase.StartAssetEditing();
                List<string> stringList = new List<string>();
                int num = 0;
                foreach (string asset in AssetDatabase.FindAssets("t:Sprite",TextureCheck.GetFilePath(Selection.objects)))
                {
                    TextureImporter atPath = AssetImporter.GetAtPath(AssetDatabase.GUIDToAssetPath(asset)) as TextureImporter;
                    if (atPath.assetPath.Contains("/NewSprite"))
                    {
                        Texture2D t = AssetDatabase.LoadAssetAtPath<Texture2D>(atPath.assetPath);
                        if ((t.height>=256 && t.width >=256)||t.height>=512 || t.width >=512)
                        {
                            string newPath = atPath.assetPath.Replace("/NewSprite", "/Texture");
                            string newDir = newPath.Replace("/"+t.name+".png", "");
                            if (!Directory.Exists(newDir))
                            {
                                //Directory.CreateDirectory(Application.dataPath.Replace("Assets", "") + directoryName);
                                AssetDatabase.CreateFolder(newDir.Replace("/Texture",""), "Texture"); 
                            }
                            if (LoadImageHistory.Contains(atPath.assetPath))
                            {
                                Debug.LogError("移动了LoadImageHistory中动态加载图" + atPath.assetPath);
                            }
                            atPath.spritePackingTag = "";
                            AssetDatabase.MoveAsset(atPath.assetPath, newPath);
                            Debug.Log(atPath.assetPath);
                            ++num;
                        }
                    }
                }

                Debug.Log((object) ("处理了:" + (object) num + "个图片"));
                //AssetDatabase.StopAssetEditing();
                AssetDatabase.Refresh();
            }
        }
    }

    //排除动态加载图片
    public  static List<string> LoadImageHistory = new List<string>();
    public static void LoadImageHistoryInit()
    {
        LoadImageHistory.Clear();
        string loadImagePath = Application.dataPath + "/LoadImageHistory.txt";
         文件是否存在
        if (File.Exists(loadImagePath))
        {
            FileStream fs = new FileStream(loadImagePath, FileMode.Open);
             "GB2312"用于显示中文字符,写其他的,中文会显示乱码
            StreamReader reader = new StreamReader(fs, UnicodeEncoding.GetEncoding("GB2312"));
            string sStuName = string.Empty;
             一行一行读取
            while ((sStuName = reader.ReadLine()) != null)
            {
                if (sStuName.Contains("UI"))
                {
                    sStuName = sStuName.Trim().ToString();
                    LoadImageHistory.Add("Assets/ResPack/"+sStuName+".png");
//                    string[] name = sStuName.Split('/').Length > 1 ? sStuName.Split('/') : sStuName.Split('\\');
                    //Debug.Log(name[1] + "    " + name[name.Length - 1]);
                    //spriteMap.AddRef(name[1], name[name.Length - 1]);
                }

            }

             关闭文件流
            fs.Close();

        }
    }


    [MenuItem("UI工具/图片整理/TextTure文件更改为平台类型(ETC2和PVRTC)", false, 4000)]
    public static void ChangeTextureFormat()
    {
        string assetPath = string.Empty;
        //if (Selection.objects.Length != 1)
        //{
        //    //Debug.LogError((object)"选择一个文件夹");
        //    assetPath = "Assets/ResPack/UI";
        //}
        //else
        //{
        //    assetPath = AssetDatabase.GetAssetPath(Selection.objects[0]);

        //}
        assetPath = "Assets/ResPack/UI";
        if (!Directory.Exists(assetPath))
        {
            Debug.Log((object)assetPath);
        }
        else
        {
            
            DirectoryInfo directoryInfo = new DirectoryInfo(Application.dataPath + "/" + assetPath.Replace("Assets/", ""));
            DirectoryInfo[] dirs = directoryInfo.GetDirectories();
            List<string> iconDir = new List<string>();
            iconDir.Add("Icon");
            iconDir.Add("Icon_bubble");
            iconDir.Add("Icon_image");
            iconDir.Add("Icon_item");
            iconDir.Add("Icon_normal");
            foreach (DirectoryInfo dir in dirs)
            {
                if (iconDir.Contains(dir.Name))
                {
                    changTypeTexture(dir);
                }
            
                DirectoryInfo[] sonDirs = dir.GetDirectories();
                foreach(DirectoryInfo d in sonDirs)
                {
                    //if (d.Name == "Texture"&&(dir.FullName.Contains("MiniMap")))
                    if (d.Name == "Texture")
                    {
                        changTypeTexture(d);
                    }
                } 
            }
            
            //AssetDatabase.StopAssetEditing();
            AssetDatabase.SaveAssets();
            AssetDatabase.Refresh();
        }
    }


    public static void changTypeTexture(DirectoryInfo dir)
    {
        int num = 0;
        int num1 = 0;
        string dirName = dir.FullName.Replace(@"\", @"/");
        string[] assetName = { dirName.Replace(Application.dataPath, "Assets") };
        foreach (string asset in AssetDatabase.FindAssets("t:Sprite", assetName))
        {
            TextureImporter textureImporter = AssetImporter.GetAtPath(AssetDatabase.GUIDToAssetPath(asset)) as TextureImporter;
            //textureImporter.SetPlatformTextureSettings("Standalone", 2048, TextureImporterFormat.DXT5);
            //textureImporter.compressionQuality = (int)TextureCompressionQuality.Normal;
            //textureImporter.textureType = TextureImporterType.Advanced;
            //textureImporter.mipmapEnabled = false;
            //textureImporter.anisoLevel = 0;
            //textureImporter.npotScale = TextureImporterNPOTScale.ToNearest;
            if (textureImporter.DoesSourceTextureHaveAlpha())
            {
                textureImporter.SetPlatformTextureSettings("iPhone", 1024, TextureImporterFormat.PVRTC_RGBA4);
                textureImporter.SetPlatformTextureSettings("Android", 1024, TextureImporterFormat.ETC2_RGBA8, true);
                ++num;
                Debug.Log(textureImporter.assetPath);
            }
            else
            {
                textureImporter.SetPlatformTextureSettings("iPhone", 1024, TextureImporterFormat.PVRTC_RGB4);
                textureImporter.SetPlatformTextureSettings("Android", 1024, TextureImporterFormat.ETC2_RGB4);
                //textureImporter.SetPlatformTextureSettings("Android", 1024, TextureImporterFormat.ETC_RGB4, (int)TextureCompressionQuality.Normal, false);
                ++num1;
                Debug.Log("不含有透明通道" + textureImporter.assetPath);
            }
            Debug.Log((object)("处理了不含有透明通道:" + (object)num + "个图片"));
            Debug.Log((object)("处理了含有透明通道:" + (object)num1 + "个图片"));
            textureImporter.SaveAndReimport();
            //EditorUtility.SetDirty(textureImporter);
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

avi9111

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值