真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);
        }
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章