Files
Main/Assets/Editor/DIY/Custom/ChangeUITextureSize.cs
2025-01-25 04:38:09 +08:00

283 lines
11 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using TextureCombineEditor;
using UnityEditor;
using UnityEngine;
namespace Thousandto.DIY
{
public class ChangeUITextureSize : EditorWindow
{
[MenuItem("Ares/UITexture出包优化出包时前使用优化内存")]
static void Open()
{
if (Application.isPlaying)
{
return;
}
var win = (ChangeUITextureSize)EditorWindow.GetWindow(typeof(ChangeUITextureSize));
LoadWhiteNames();
win.Show();
}
private string _prefabPath = string.Empty;
private const string WhiteNameKey = "ChangeUITextureSizeWhiteName";
private static List<string> _whiteNames = null;
private string _addWhiteText = string.Empty;
//保存图片优化白名单的文件
private static string _whiteTexCfgFile = "../Main/Assets/GameAssets/ExportResources/EditorConfig/TextureConfig.txt";
static void LoadWhiteNames()
{
_whiteNames = new List<string>();
if (File.Exists(_whiteTexCfgFile))
{
List<string> cfgFileNameList = new List<string>(File.ReadAllLines(_whiteTexCfgFile));
for (int i = 0; i < cfgFileNameList.Count; i++)
{
_whiteNames.Add(cfgFileNameList[i].Trim());
}
}
var names = PlayerPrefs.GetString(WhiteNameKey);
if (!string.IsNullOrEmpty(names))
{
var paramArray = names.Split(';');
for (int i = 0; i < paramArray.Length; ++i)
{
if (!string.IsNullOrEmpty(paramArray[i]) && !_whiteNames.Contains(paramArray[i]))
{
_whiteNames.Add(paramArray[i]);
}
}
PlayerPrefs.DeleteKey(WhiteNameKey);
SaveWhiteNames();
}
}
static void SaveWhiteNames()
{
var strBuilder = new StringBuilder(10240);
for (int i = 0; i < _whiteNames.Count; ++i)
{
if (!string.IsNullOrEmpty(_whiteNames[i]))
{
strBuilder.AppendLine(_whiteNames[i]);
}
}
if (!File.Exists(_whiteTexCfgFile))
{
File.Create(_whiteTexCfgFile).Dispose();
}
File.WriteAllText(_whiteTexCfgFile, strBuilder.ToString());
}
void OnGUI()
{
EditorGUILayout.BeginVertical();
EditorGUILayout.LabelField("选择路径");
EditorGUILayout.Space();
EditorGUILayout.LabelField("需要优化UITexture路径");
EditorGUILayout.BeginHorizontal();
if (GUILayout.Button("浏览", GUILayout.Width(50)))
{
_prefabPath = EditorUtility.OpenFolderPanel("ChangeTexture Path", _prefabPath, "");
}
if (string.IsNullOrEmpty(_prefabPath))
{
EditorGUILayout.LabelField("null...");
}
else
{
EditorGUILayout.LabelField(_prefabPath);
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.EndVertical();
EditorGUILayout.BeginVertical();
GUILayout.Label("白名单(不压缩,用于带文字的图片)");
bool isSaveWhite = false;
if(_whiteNames == null)
{
LoadWhiteNames();
}
for (int i = _whiteNames.Count - 1; i >= 0; --i)
{
EditorGUILayout.BeginHorizontal();
GUILayout.Label(_whiteNames[i]);
if (GUILayout.Button("X", GUILayout.Width(30)))
{
_whiteNames.RemoveAt(i);
isSaveWhite = true;
}
EditorGUILayout.EndHorizontal();
}
EditorGUILayout.BeginHorizontal();
_addWhiteText = EditorGUILayout.TextField(_addWhiteText);
if (GUILayout.Button("添加白名单", GUILayout.Width(100)))
{
if (!string.IsNullOrEmpty(_addWhiteText) && !_whiteNames.Contains(_addWhiteText))
{
_whiteNames.Add(_addWhiteText);
isSaveWhite = true;
}
}
if (isSaveWhite)
{
SaveWhiteNames();
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.EndVertical();
if (GUILayout.Button("开始优化", GUILayout.Width(100)))
{
if (string.IsNullOrEmpty(_prefabPath))
return;
if (Directory.Exists(_prefabPath))
{
DirectoryInfo direction = new DirectoryInfo(_prefabPath);
FileInfo[] files = direction.GetFiles("*.*", SearchOption.TopDirectoryOnly);
var doCount = 0;
for (int i = 0; i < files.Length; ++i)
{
var path = files[i].FullName;
if (path.EndsWith(".png", StringComparison.CurrentCultureIgnoreCase) || path.EndsWith(".jpg", StringComparison.CurrentCultureIgnoreCase))
{
path = path.Replace('\\', '/');
var starIndex = path.IndexOf("/Assets/", 0);
path = path.Remove(0, starIndex + 1);
var name = files[i].Name;
starIndex = name.LastIndexOf('.');
name = name.Remove(starIndex);
if (SetTextureFormat(path))
{
++doCount;
}
}
}
UnityEngine.Debug.LogErrorFormat("优化完成,共优化{0}张图片", doCount);
}
}
}
public static bool SetTextureFormat(string path)
{
if(_whiteNames == null)
{
LoadWhiteNames();
}
path = path.Replace('\\', '/');
var startIndex = path.LastIndexOf('/');
var endIndex = path.LastIndexOf('.');
string fileName = path.Substring(startIndex + 1, endIndex - startIndex - 1);
AssetImporter ai = AssetImporter.GetAtPath(path);
bool isChanged = false;
if (ai != null && ai is UnityEditor.TextureImporter)
{
#if UNITY_STANDALONE
//pc版本资源不做图片压缩
if (true)
#else
if (_whiteNames.Contains(fileName))
#endif
{
TextureImporter textureImporter = (TextureImporter)ai;
if (textureImporter.isReadable != false)
{
isChanged = true;
textureImporter.isReadable = false;
}
if (textureImporter.textureType != TextureImporterType.GUI)
{
isChanged = true;
textureImporter.textureType = TextureImporterType.GUI;
}
if (textureImporter.mipmapEnabled != false)
{
isChanged = true;
textureImporter.mipmapEnabled = false;
}
if (textureImporter.alphaSource != TextureImporterAlphaSource.FromInput)
{
isChanged = true;
textureImporter.alphaSource = TextureImporterAlphaSource.FromInput;
}
if (textureImporter.alphaIsTransparency != true)
{
isChanged = true;
textureImporter.alphaIsTransparency = true;
}
if (textureImporter.npotScale != TextureImporterNPOTScale.None)
{
isChanged = true;
textureImporter.npotScale = TextureImporterNPOTScale.None;
}
if (textureImporter.maxTextureSize != 1024)
{
isChanged = true;
textureImporter.maxTextureSize = 1024;
}
if (textureImporter.textureCompression != TextureImporterCompression.Uncompressed)
{
isChanged = true;
textureImporter.textureCompression = TextureImporterCompression.Uncompressed;
}
}
else
{
TextureImporter textureImporter = (TextureImporter)ai;
if (textureImporter.isReadable != false)
{
isChanged = true;
textureImporter.isReadable = false;
}
if (textureImporter.textureType != TextureImporterType.GUI)
{
isChanged = true;
textureImporter.textureType = TextureImporterType.GUI;
}
if (textureImporter.mipmapEnabled != false)
{
isChanged = true;
textureImporter.mipmapEnabled = false;
}
if (textureImporter.alphaSource != TextureImporterAlphaSource.FromInput)
{
isChanged = true;
textureImporter.alphaSource = TextureImporterAlphaSource.FromInput;
}
if (textureImporter.alphaIsTransparency != true)
{
isChanged = true;
textureImporter.alphaIsTransparency = true;
}
if (textureImporter.npotScale != TextureImporterNPOTScale.ToNearest)
{
isChanged = true;
textureImporter.npotScale = TextureImporterNPOTScale.ToNearest;
}
if (textureImporter.maxTextureSize != 1024)
{
isChanged = true;
textureImporter.maxTextureSize = 1024;
}
if (textureImporter.textureCompression != TextureImporterCompression.Compressed)
{
isChanged = true;
textureImporter.textureCompression = TextureImporterCompression.Compressed;
}
}
if (isChanged)
{
AssetDatabase.ImportAsset(path, ImportAssetOptions.ForceUpdate);
}
}
return isChanged;
}
}
}