某大公司,大游戏的一些代码,但是没怎么用上,都扔角落里了
下面信息量很多,但其实关键就是那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);
}
}
}