11#if UNITY_EDITOR
2- using System . Collections . Generic ;
32using System . IO ;
4- using System . Linq ;
53using UnityEditor ;
64using UnityEngine ;
75using UnityEditor . U2D . Sprites ;
@@ -12,62 +10,88 @@ public static class SpriteExtractor
1210 {
1311 #region METHODS
1412
15- [ MenuItem ( "Assets/Extract/Sprites/Extract All Sprites" , priority = 10 ) ]
16- public static void ExtractAllSprites ( )
13+
14+ [ MenuItem ( "Assets/Extract/Sprites/Extract Selected Sprites" , priority = 10 ) ]
15+ public static void ExtractSelectedSprites ( )
1716 {
18- Object selectedObject = Selection . activeObject ;
19- if ( selectedObject is not Texture2D texture2D )
17+ Object [ ] selectedObjects = Selection . objects ;
18+ if ( selectedObjects . Length == 0 )
2019 {
2120 return ;
2221 }
2322
24- string assetPath = AssetDatabase . GetAssetPath ( selectedObject ) ;
25- string path = Path . GetDirectoryName ( assetPath ) ;
26- string format = Path . GetExtension ( assetPath ) ;
27-
28- ISpriteEditorDataProvider spriteDataProvider = GetSpriteDateProvider ( selectedObject ) ;
29- SpriteRect [ ] spriteRects = spriteDataProvider . GetSpriteRects ( ) ;
30- TextureImporter textureImporter = AssetImporter . GetAtPath ( assetPath ) as TextureImporter ;
23+ TextureImporter textureImporter = null ;
3124
32- if ( ! textureImporter ! . isReadable )
25+ foreach ( Object selectedObject in selectedObjects )
3326 {
34- textureImporter . isReadable = true ;
35- textureImporter . SaveAndReimport ( ) ;
36- }
27+ string assetPath = AssetDatabase . GetAssetPath ( selectedObjects [ 0 ] ) ;
28+ string path = Path . GetDirectoryName ( assetPath ) ;
29+ string format = Path . GetExtension ( assetPath ) ;
30+ textureImporter = AssetImporter . GetAtPath ( assetPath ) as TextureImporter ;
3731
38- foreach ( SpriteRect spriteRect in spriteRects )
39- {
40- Texture2D newTexture = texture2D . GetTextureFromBounds (
41- ( int ) spriteRect . rect . x ,
42- ( int ) spriteRect . rect . y ,
43- ( int ) spriteRect . rect . width ,
44- ( int ) spriteRect . rect . height ) ;
32+ if ( ! textureImporter ! . isReadable )
33+ {
34+ textureImporter . isReadable = true ;
35+ textureImporter . SaveAndReimport ( ) ;
36+ }
37+
38+ if ( selectedObject is not Sprite sprite )
39+ {
40+ continue ;
41+ }
42+
43+ Texture2D newTexture = sprite . texture . GetTextureFromBounds (
44+ ( int ) sprite . rect . x ,
45+ ( int ) sprite . rect . y ,
46+ ( int ) sprite . rect . width ,
47+ ( int ) sprite . rect . height ) ;
4548 newTexture . filterMode = textureImporter . filterMode ;
4649 newTexture . Apply ( ) ;
4750 byte [ ] pngTexture = newTexture . EncodeTexture2D ( format ) ;
48- File . WriteAllBytes ( $ "{ Path . Combine ( path ! , spriteRect . name ) } { format } ", pngTexture ) ;
51+ File . WriteAllBytes ( $ "{ Path . Combine ( path ! , sprite . name ) } { format } ", pngTexture ) ;
52+ }
53+
54+ if ( textureImporter )
55+ {
56+ textureImporter . isReadable = false ;
57+ textureImporter . SaveAndReimport ( ) ;
4958 }
5059
51- textureImporter . isReadable = false ;
52- textureImporter . SaveAndReimport ( ) ;
5360 AssetDatabase . Refresh ( ) ;
5461 }
5562
56- [ MenuItem ( "Assets/Extract/Sprites/Extract Selected Sprites " , priority = 10 ) ]
57- public static void ExtractSprites ( )
63+ [ MenuItem ( "Assets/Extract/Sprites/Extract All " , priority = 10 ) ]
64+ public static void ExtractAllFromSelectedSpritesheets ( )
5865 {
5966 Object [ ] selectedObjects = Selection . objects ;
6067 if ( selectedObjects . Length == 0 )
6168 {
6269 return ;
6370 }
6471
65- string assetPath = AssetDatabase . GetAssetPath ( selectedObjects [ 0 ] ) ;
72+ foreach ( Object selectedObject in selectedObjects )
73+ {
74+ ExtractAllSpritesHelper ( selectedObject ) ;
75+ }
76+ }
77+
78+ #endregion
79+
80+ #region HELPER METHODS
81+
82+ private static void ExtractAllSpritesHelper ( Object sourceObject )
83+ {
84+ if ( sourceObject is not Texture2D texture2D )
85+ {
86+ return ;
87+ }
88+
89+ string assetPath = AssetDatabase . GetAssetPath ( sourceObject ) ;
6690 string path = Path . GetDirectoryName ( assetPath ) ;
6791 string format = Path . GetExtension ( assetPath ) ;
6892
69- ISpriteEditorDataProvider spriteDataProvider = GetSpriteDateProvider ( selectedObjects [ 0 ] ) ;
70- List < SpriteRect > spriteRects = spriteDataProvider . GetSpriteRects ( ) . ToList ( ) ;
93+ ISpriteEditorDataProvider spriteDataProvider = GetSpriteDateProvider ( sourceObject ) ;
94+ SpriteRect [ ] spriteRects = spriteDataProvider . GetSpriteRects ( ) ;
7195 TextureImporter textureImporter = AssetImporter . GetAtPath ( assetPath ) as TextureImporter ;
7296
7397 if ( ! textureImporter ! . isReadable )
@@ -76,15 +100,9 @@ public static void ExtractSprites()
76100 textureImporter . SaveAndReimport ( ) ;
77101 }
78102
79- foreach ( Object selectedObject in selectedObjects )
103+ foreach ( SpriteRect spriteRect in spriteRects )
80104 {
81- if ( selectedObject is not Sprite sprite )
82- {
83- continue ;
84- }
85-
86- SpriteRect spriteRect = spriteRects . Find ( spriteRect => string . CompareOrdinal ( spriteRect . name , sprite . name ) == 0 ) ;
87- Texture2D newTexture = sprite . texture . GetTextureFromBounds (
105+ Texture2D newTexture = texture2D . GetTextureFromBounds (
88106 ( int ) spriteRect . rect . x ,
89107 ( int ) spriteRect . rect . y ,
90108 ( int ) spriteRect . rect . width ,
@@ -100,15 +118,12 @@ public static void ExtractSprites()
100118 AssetDatabase . Refresh ( ) ;
101119 }
102120
103- #endregion
104-
105- #region HELPER METHODS
106-
107121 private static ISpriteEditorDataProvider GetSpriteDateProvider ( Object selectedObject )
108122 {
109123 SpriteDataProviderFactories factory = new SpriteDataProviderFactories ( ) ;
110124 factory . Init ( ) ;
111- ISpriteEditorDataProvider spriteDataProvider = factory . GetSpriteEditorDataProviderFromObject ( selectedObject ) ;
125+ ISpriteEditorDataProvider spriteDataProvider =
126+ factory . GetSpriteEditorDataProviderFromObject ( selectedObject ) ;
112127 spriteDataProvider . InitSpriteEditorDataProvider ( ) ;
113128 return spriteDataProvider ;
114129 }
0 commit comments