前幾天由於項目原因,做了一個自動根據模型自動創建動畫狀態機,然后緊接着做了根據動畫狀態機和模型一鍵制作Prefab. 現在因為圖片數量或者其它原因需要寫一個一鍵設置圖片格式的插件.
至於制作動畫狀態機和制作預制物體我會在以后的日子給大家貼出我的代碼,下面開始進入今天的主題.
需求: 點擊文件夾,一鍵把文件里面的圖片全部設置成需要的格式.
思路: 第一步取到文件夾一直下的所有文件,第二步 過濾不是圖片的文件, 第三部設置圖片格式
思路很簡單下面先看一下取出所有文件的代碼,思路是利用c#的文件遞歸的思想進行遍歷文件,得到所有文件
public void CollectModel(Object fold) { allControlls.Clear(); string relatepath = AssetDatabase.GetAssetPath(fold); string folderpath = Path.GetFullPath(relatepath); CollectAllFiles(folderpath.Replace("\\", "/").Replace(Application.dataPath, "Assets")); } public void CollectSkinOrAnimator(Object fold) { allControlls.Clear(); string relatepath = AssetDatabase.GetAssetPath(fold); string folderpath = Path.GetFullPath(relatepath); CollectAnimatorFiles(folderpath.Replace("\\", "/").Replace(Application.dataPath, "Assets")); } void CollectAnimatorFiles(string path) { string[] localfiles = Directory.GetFiles(path); string[] dirs = Directory.GetDirectories(path); for (int i = 0; i < localfiles.Length; i++) { string filepath = localfiles[i]; if (filepath.Contains(".meta")) continue; Object obj = AssetDatabase.LoadAssetAtPath<Object>(filepath); if (!allControlls.Contains(obj)) allControlls.Add(obj); } for (int j = 0; j < dirs.Length; j++) { CollectAnimatorFiles(dirs[j]); } } void CollectAllFiles(string path) { string[] localfiles = Directory.GetFiles(path); string[] dirs = Directory.GetDirectories(path); for (int i = 0; i < localfiles.Length; i++) { string filepath = localfiles[i]; if (filepath.Contains(".meta")) continue; if (!IsPicture(filepath)) continue; Object obj = AssetDatabase.LoadAssetAtPath<Object>(filepath); if (!allControlls.Contains(obj)) allControlls.Add(obj); } for (int j = 0; j < dirs.Length; j++) { CollectAllFiles(dirs[j]); } }
fold 是選中的文件夾,傳入進來就會吧所有的文件讀取到allControlls中去
接下來看一下過濾圖片的方法,上面我已經過濾了.meta文件和文件夾,接下來只需要判斷是否是圖片即可
還是看代碼比較實在
private bool IsPicture(string filePath) { try { FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read); BinaryReader reader = new BinaryReader(fs); string fileClass; byte buffer; buffer = reader.ReadByte(); fileClass = buffer.ToString(); buffer = reader.ReadByte(); fileClass += buffer.ToString(); reader.Close(); fs.Close(); if (fileClass == "255216" || fileClass == "7173" || fileClass == "13780" || fileClass == "6677") //255216是jpg;7173是gif;6677是BMP,13780是PNG { return true; } else { return false; } } catch { return false; } }
代碼很簡單就是讀取文件,如果讀取異常則不是圖片,如果讀取成功則判斷文件的頭文件是不是圖片即可
接下來到了重點,設置圖片格式,代碼也不是很難
主要是對圖片的用途設置,可讀可寫,是否使用mipmap和壓縮格式等
static void onPreprocessTexture(string path, TextureImportData textureImportData) { //自動設置類型; TextureImporter textureImporter = AssetImporter.GetAtPath(path) as TextureImporter; textureImporter.textureType = textureImportData.textureImporterType; textureImporter.textureShape = textureImportData.ShapeType; textureImporter.isReadable = textureImportData.isReadable; textureImporter.mipmapEnabled = textureImportData.mipmapEnabled; TextureImporterPlatformSettings settingAndroid = textureImporter.GetPlatformTextureSettings("UNITY_ANDROID"); settingAndroid.overridden = true; settingAndroid.format = textureImportData.textureImporterFormat; //設置格式 textureImporter.SetPlatformTextureSettings(settingAndroid); textureImporter.SaveAndReimport(); }
發現少了一個關鍵的模型類,主要用於傳數據使用
public class TextureImportData { public TextureImporterType textureImporterType = TextureImporterType.Default; public bool isReadable = false; public bool mipmapEnabled = false; public TextureImporterShape ShapeType = TextureImporterShape.Texture2D; /// <summary> /// 圖片壓縮格式 /// androdi TextureImporterFormat.ETC2_RGB4; /// ios TextureImporterFormat.PVRTC_RGB4 /// </summary> public TextureImporterFormat textureImporterFormat = TextureImporterFormat.ETC2_RGB4; }
本人才疏學淺,如有不對歡迎大家指正
