-
-
Save xinbot/e40556c38c44abf5a3c2224fce2ade91 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| using System.Collections.Generic; | |
| using System.IO; | |
| using UnityEditor; | |
| using UnityEditor.U2D.Sprites; | |
| using UnityEngine; | |
| public class UIEmojiTools : Editor | |
| { | |
| private static readonly List<SpriteRect> _spriteRects = new(); | |
| private static List<Sprite> _sprites = new (); | |
| [MenuItem("Assets/Create/2D/Create Emoji Prefab", false)] | |
| public static void CreateEmojiPrefab() | |
| { | |
| var textures = Selection.GetFiltered<Texture2D>(SelectionMode.Assets); | |
| if (textures.Length <= 0) | |
| { | |
| Debug.LogError("[UIEmojiTools] Should Select Textture2D!"); | |
| return; | |
| } | |
| _sprites.Clear(); | |
| for (int i = 0; i < textures.Length; i++) | |
| { | |
| var texture = textures[i]; | |
| ProcessTexture(ref _sprites, texture, 320, 320); | |
| } | |
| Debug.LogError($"[UIEmojiTools] Sprite Count: {_sprites.Count}!"); | |
| } | |
| private static void ProcessTexture(ref List<Sprite> sprites, Texture2D texture, int sliceWidth, int sliceHeight) | |
| { | |
| var assetPath = AssetDatabase.GetAssetPath(texture); | |
| var importer = AssetImporter.GetAtPath(assetPath) as TextureImporter; | |
| if (importer == null) | |
| { | |
| Debug.LogError("[UIEmojiTools] Failed to get Texture Importer!"); | |
| return; | |
| } | |
| importer.textureType = TextureImporterType.Sprite; | |
| importer.spriteImportMode = SpriteImportMode.Multiple; | |
| importer.spritePixelsPerUnit = 16; | |
| importer.mipmapEnabled = false; | |
| importer.textureCompression = TextureImporterCompression.Uncompressed; | |
| importer.maxTextureSize = 2048; | |
| var textureSettings = new TextureImporterSettings(); | |
| importer.ReadTextureSettings(textureSettings); | |
| textureSettings.spriteMeshType = SpriteMeshType.Tight; | |
| textureSettings.spriteExtrude = 0; | |
| importer.SetTextureSettings(textureSettings); | |
| var fileName = Path.GetFileNameWithoutExtension(assetPath); | |
| var factory = new SpriteDataProviderFactories(); | |
| factory.Init(); | |
| ISpriteEditorDataProvider dataProvider = factory.GetSpriteEditorDataProviderFromObject(texture); | |
| dataProvider.InitSpriteEditorDataProvider(); | |
| dataProvider.SetSpriteRects(GenerateSpriteRectData(fileName, texture.width, texture.height, sliceWidth, sliceHeight)); | |
| dataProvider.Apply(); | |
| var assetImporter = dataProvider.targetObject as AssetImporter; | |
| assetImporter.SaveAndReimport(); | |
| var assets = AssetDatabase.LoadAllAssetsAtPath(assetPath); | |
| foreach (Object asset in assets) | |
| { | |
| if (asset is Sprite sprite && sprite.name != texture.name) | |
| { | |
| sprites.Add(sprite); | |
| } | |
| } | |
| } | |
| private static SpriteRect[] GenerateSpriteRectData(string fileName, int textureWidth, int textureHeight, int sliceWidth, int sliceHeight) | |
| { | |
| _spriteRects.Clear(); | |
| int rowCount = Mathf.RoundToInt(1.0f * textureHeight / sliceHeight); | |
| int columnCount = Mathf.RoundToInt(1.0f * textureWidth / sliceWidth); | |
| for (int x = 0; x < rowCount; x++) | |
| { | |
| int yPos = x * sliceHeight; | |
| for (int y = 0; y < columnCount; y++) | |
| { | |
| int xPos = y * sliceWidth; | |
| SpriteRect spriteRect = new SpriteRect(); | |
| spriteRect.rect = new Rect(xPos, yPos, sliceWidth, sliceHeight); | |
| spriteRect.pivot = new Vector2(0.5f, 0.5f); | |
| spriteRect.name = $"{fileName}_{x}_{y}"; | |
| spriteRect.alignment = SpriteAlignment.Center; | |
| spriteRect.border = new Vector4(0, 0, 0, 0); | |
| _spriteRects.Add(spriteRect); | |
| } | |
| } | |
| return _spriteRects.ToArray(); | |
| } | |
| } |
Author
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Full list of available data providers in 2D Sprite package’s Scripting API section