using UnityEditor;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using System;
using System.Reflection;
public class EditorTool : Editor
{
[MenuItem("Tools/Resource/SearchWarningResource")]
public static void SearchResource()
{
string path = Application.dataPath;
string[] dirs = Directory.GetDirectories(path);
SearchFile(dirs);
}
static public void SearchFile(string[] path)
{
foreach (string item in path)
{
string[] getFile = Directory.GetFiles(item);
foreach (string file in getFile)
{
FileInfo fileInfo = new FileInfo(file);
if (fileInfo.Extension.Equals(".png", StringComparison.CurrentCultureIgnoreCase) || fileInfo.Extension.Equals(".jpg", StringComparison.CurrentCultureIgnoreCase))
{
string _file = file.Replace("\\", "/");
_file = _file.Substring(_file.IndexOf("Assets"));
TextureImporter textureImporter = AssetImporter.GetAtPath(_file) as TextureImporter;
if (textureImporter == null)
return;
AssetDatabase.ImportAsset(_file);
object[] args = new object[2] { 0, 0 };
MethodInfo mi = typeof(TextureImporter).GetMethod("GetWidthAndHeight", BindingFlags.NonPublic | BindingFlags.Instance);
mi.Invoke(textureImporter, args);
int width = (int)args[0];
int height = (int)args[1];
if (width > 2048)
{
Texture2D texture = AssetDatabase.LoadAssetAtPath<Texture2D>(_file);
long size = GetTextureFileSize(texture, _file);
//long ySize = GetTextureRuntimeMemorySize(texture);
Debug.LogError(string.Format("警告,width:{0},height:{1},占用内存:{2}M,图片资源{3}", width, height, size / 1048576, fileInfo.FullName));
}
else if (height > 2048)
{
Texture2D texture = AssetDatabase.LoadAssetAtPath<Texture2D>(_file);
long size = GetTextureFileSize(texture, _file);
//long ySize = GetTextureRuntimeMemorySize(texture);
Debug.LogError(string.Format("警告,width:{0},height:{1},占用内存:{2}M,图片资源{3}", width, height, size / 1048576, fileInfo.FullName));
}
}
}
string[] getFoder = Directory.GetDirectories(item);
SearchFile(getFoder);
}
}
public static long GetTextureFileSize(Texture2D texture, string _file)
{
try
{
long fileSize = 0;
// 使用反射获取UnityEditor.TextureUtil类的Type
Type textureUtilType = typeof(TextureImporter).Assembly.GetType("UnityEditor.TextureUtil");
// 使用反射获取UnityEditor.TextureUtil类的GetStorageMemorySizeLong方法
MethodInfo getStorageMemorySizeLongMethod = textureUtilType.GetMethod("GetStorageMemorySizeLong", BindingFlags.Static | BindingFlags.Public);
// 调用GetStorageMemorySizeLong方法获取存储内存大小
fileSize = (long)getStorageMemorySizeLongMethod.Invoke(null, new object[] { texture });
return fileSize;
}
catch (Exception e)
{
Debug.LogError("GetTextureFileSize error:" + _file);
return 0;
}
}
public static long GetTextureRuntimeMemorySize(Texture2D texture)
{
try
{
long memorySize;
// 使用反射获取UnityEditor.TextureUtil类的Type
Type textureUtilType = typeof(TextureImporter).Assembly.GetType("UnityEditor.TextureUtil");
// 使用反射获取UnityEditor.TextureUtil类的GetRuntimeMemorySizeLong方法
MethodInfo getRuntimeMemorySizeLongMethod = textureUtilType.GetMethod("GetRuntimeMemorySizeLong", BindingFlags.Static | BindingFlags.Public);
// 调用GetRuntimeMemorySizeLong方法获取运行时内存大小
memorySize = (long)getRuntimeMemorySizeLongMethod.Invoke(null, new object[] { texture });
return memorySize;
}
catch (Exception e)
{
Debug.LogError("GetTextureRuntimeMemorySize error:" + e);
return 0;
}
}
}