某大公司,大遊戲的一些代碼,但是沒怎麼用上,都扔角落裏了
下面信息量很多,但其實關鍵就是那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);
}
}
}