using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.IO;
//展示UV
public class OutTextureUV : EditorWindow
{
public Texture2D mTexture;
public List<Sprite> mSprites = new List<Sprite>();
public string mSpritesPath = null;
public string mSavePath = null;
public Texture2D mOutTexture;
Vector2 mScrollPos;
SerializedObject mSerializedObject;
SerializedProperty mSerializedProperty;
[MenuItem("WindowTools/OutTextureUV", priority = 0)]
public static void ShowWindow() {
EditorWindow.GetWindow(typeof(OutTextureUV));
}
private void OnGUI() {
EditorGUILayout.BeginVertical();
EditorGUILayout.LabelField("主纹理");
mTexture = EditorGUILayout.ObjectField(mTexture, typeof(Texture2D), false) as Texture2D;
EditorGUILayout.LabelField("Sprite子图");
mSerializedObject = new SerializedObject(this);
mSerializedProperty = mSerializedObject.FindProperty("mSprites");
EditorGUILayout.PropertyField(mSerializedProperty, true);
mSerializedObject.ApplyModifiedProperties();
EditorGUILayout.LabelField("Sprite子图路径");
Rect rect1 = EditorGUILayout.GetControlRect(GUILayout.Width(400));
mSpritesPath = EditorGUI.TextField(rect1, mSpritesPath);
mSpritesPath = GetMouseSelectPath(rect1, mSpritesPath);
if (string.IsNullOrEmpty(mSpritesPath)) {
mSpritesPath = Application.dataPath;
}
EditorGUILayout.LabelField("输出文件路径");
Rect rect2 = EditorGUILayout.GetControlRect(GUILayout.Width(400));
mSavePath = EditorGUI.TextField(rect2, mSavePath);
mSavePath = GetMouseSelectPath(rect2, mSavePath);
if (string.IsNullOrEmpty(mSavePath)) {
mSavePath = Directory.GetParent(Application.dataPath).FullName;
}
EditorGUILayout.EndVertical();
if (GUILayout.Button("Start")) {
Start();
}
}
private void Start() {
List<Sprite> allSprites = new List<Sprite>();
allSprites.AddRange(mSprites);
if (!string.IsNullOrEmpty(mSpritesPath)) {
FileInfo[] fileInfos = new DirectoryInfo(mSpritesPath).GetFiles("*.asset", SearchOption.AllDirectories);
foreach (FileInfo fileInfo in fileInfos) {
string fileResourcesPath = MakeRelativePath(fileInfo.FullName, Application.dataPath);
Sprite sprite = AssetDatabase.LoadAssetAtPath<Sprite>(Path.Combine("Assets", fileResourcesPath));
if (null == sprite || sprite.texture != mTexture) {
continue;
}
allSprites.Add(sprite);
}
}
string textureAssetPath = AssetDatabase.GetAssetPath(mTexture);
Object[] sprites = AssetDatabase.LoadAllAssetsAtPath(textureAssetPath);
for (int i = 0; i < sprites.Length; i++) {
Sprite sprite = sprites[i] as Sprite;
if (null == sprite) {
continue;
}
allSprites.Add(sprite);
}
mOutTexture = new Texture2D(mTexture.width, mTexture.height);
//初始化
Color initColor = new Color(0, 0, 0, 0);
for (int i = 0; i < mTexture.width; i++) {
for (int k = 0; k < mTexture.height; k++) {
mOutTexture.SetPixel(i, k, initColor);
}
}
for (int i = 0; i < allSprites.Count; i++) {
Sprite sprite = allSprites[i];
Rect rect = sprite.textureRect;
for (int k = (int)rect.x; k < rect.x + rect.width; k++) {
mOutTexture.SetPixel(k, (int)rect.y, Color.red);
mOutTexture.SetPixel(k, (int)(rect.y + rect.height - 1), Color.red);
}
for (int k = (int)rect.y; k < rect.y + rect.height; k++) {
mOutTexture.SetPixel((int)rect.x, k, Color.red);
mOutTexture.SetPixel((int)(rect.x + rect.width - 1), k, Color.red);
}
}
mOutTexture.Apply();
byte[] bytes = mOutTexture.EncodeToPNG();
File.WriteAllBytes(Path.Combine(mSavePath, "OutTexture.png"), bytes);
}
//获取鼠标拖动的路径
protected static string GetMouseSelectPath(Rect rect, string defaultPath, bool isRelativePath = false) {
if ((Event.current.type == EventType.DragUpdated || Event.current.type == EventType.DragExited) && rect.Contains(Event.current.mousePosition)) {
DragAndDrop.visualMode = DragAndDropVisualMode.Generic;
if (DragAndDrop.paths != null && DragAndDrop.paths.Length > 0) {
defaultPath = DragAndDrop.paths[0];
}
}
if (null == defaultPath) {
return defaultPath;
}
else if (isRelativePath) {
return MakeRelativePath(defaultPath, Directory.GetParent(Application.dataPath).FullName);
}
else if (defaultPath.StartsWith("Assets")) {
return Path.Combine(Directory.GetParent(Application.dataPath).FullName, defaultPath);
}
return defaultPath;
}
// 制作相对路径
public static string MakeRelativePath(string subPath, string rootPath) {
System.Text.StringBuilder relativePath = new System.Text.StringBuilder();
string[] subArray = subPath.Replace('\\', '/').Split('/');
string[] rootArray = rootPath.Replace('\\', '/').Split('/');
for (int i = 0; i < subArray.Length; i++) {
if (i < rootArray.Length) {
if (!subArray[i].Equals(rootArray[i])) {
return subPath;
}
continue;
}
relativePath.Append(subArray[i]);
if (i + 1 < subArray.Length) {
relativePath.Append('/');
}
}
return relativePath.ToString();
}
}
Unity Texture图集上Sprite的UV导出
最新推荐文章于 2023-06-14 23:22:16 发布