Sprite导出工具
#if UNITY_EDITOR using System; using System.IO; using UnityEditor; using UnityEngine; public static class SpriteTool { //==================== OpenDirAfterExport const string PrefsKey_OpenDirAfterExport = "ExportSelectSpriteTool.OpenDirAfterExport"; const string MenuItemPath_OpenDirAfterExport = "Assets/Image/Open Dir After Export"; private static int s_OpenSpriteExportDirFlag = -1; //-1_未初始化, 0_false, 1_true public static bool IsOpenDirAfterExport { get { if (-1 == s_OpenSpriteExportDirFlag) { s_OpenSpriteExportDirFlag = 1; s_OpenSpriteExportDirFlag = EditorPrefs.GetInt(PrefsKey_OpenDirAfterExport, 1); //默认开启 } return 1 == s_OpenSpriteExportDirFlag; } set { var newValue = value ? 1 : 0; if (s_OpenSpriteExportDirFlag != newValue) { s_OpenSpriteExportDirFlag = newValue; EditorPrefs.SetInt(PrefsKey_OpenDirAfterExport, s_OpenSpriteExportDirFlag); } } } [MenuItem(MenuItemPath_OpenDirAfterExport, true)] static bool MenuItemInit_IsOpenDirAfterExport() { Menu.SetChecked(MenuItemPath_OpenDirAfterExport, IsOpenDirAfterExport); return true; } [MenuItem(MenuItemPath_OpenDirAfterExport, false)] static void MenuItem_IsOpenDirAfterExport() { IsOpenDirAfterExport = !Menu.GetChecked(MenuItemPath_OpenDirAfterExport); } //====================
//==================== ExportSelectSprite const string Output_Dir_Path = "_Temp/ExportSprite/"; const string MenuItemPath_ExportSelectSprite = "Assets/Image/Export Select Sprite"; [MenuItem(MenuItemPath_ExportSelectSprite, true)] static bool MenuItemValidator_ExportSelectSprite() { if (Application.isPlaying) return false; if (null == Selection.activeObject) return false; var sp = Selection.activeObject as Sprite; return null != sp; } [MenuItem(MenuItemPath_ExportSelectSprite)] static void MenuItem_ExportSelectSprite() { var sp = Selection.activeObject as Sprite; if (null == sp) return; if (!Directory.Exists(Output_Dir_Path) && null == Directory.CreateDirectory(Output_Dir_Path)) { Debug.LogError($"{Output_Dir_Path} create fail!"); return; } var srcTex = sp.texture; var srcTempRT = RenderTexture.GetTemporary(srcTex.width, srcTex.height, 0, RenderTextureFormat.Default); Graphics.Blit(srcTex, srcTempRT); var oldActiveRT = RenderTexture.active; RenderTexture.active = srcTempRT; OutputSprite(srcTempRT, sp); RenderTexture.active = oldActiveRT; RenderTexture.ReleaseTemporary(srcTempRT); Debug.Log($"finish: {Output_Dir_Path}"); } static void OutputSprite(RenderTexture srcTempRT, Sprite sp) { Rect rect = sp.rect; //该Rect的width, height为裁掉空白前的宽高 Vector2 offset = sp.textureRectOffset; Rect texRect = sp.textureRect; //该Rect的width, height为裁掉空白后的宽高 var spriteTex = new Texture2D((int)rect.width, (int)rect.height, TextureFormat.RGBA32, false); var readRect = new Rect(texRect.x, srcTempRT.height - (texRect.y + texRect.height), //RenderTexture-(0, 0)为左上角, 要转换成左下角(0, 0) texRect.width, texRect.height); spriteTex.ReadPixels(readRect, (int)offset.x, (int)offset.y); //Texture2D-(0, 0)为左下角 spriteTex.Apply(); var pngBytes = spriteTex.EncodeToPNG(); var spriteOutPath = Path.Combine(Output_Dir_Path, $"{sp.name}.png"); File.WriteAllBytes(spriteOutPath, pngBytes); if (IsOpenDirAfterExport) { OpenDirAndSelectFile(Path.GetFullPath(spriteOutPath)); } } //==================== private static void OpenDirAndSelectFile(string fileFullPath) { var process = new System.Diagnostics.Process(); var psi = new System.Diagnostics.ProcessStartInfo("Explorer.exe"); psi.Arguments = $"/Select,{fileFullPath}"; process.StartInfo = psi; try { process.Start(); } catch (Exception ex) { Debug.LogError($"{ex.StackTrace}"); } finally { process.Close(); } } } #endif
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端