Skip to content

Instantly share code, notes, and snippets.

@xinbot
Forked from shadesbelow/AutoSpriteSlicer.cs
Last active April 21, 2026 13:05
Show Gist options
  • Select an option

  • Save xinbot/e40556c38c44abf5a3c2224fce2ade91 to your computer and use it in GitHub Desktop.

Select an option

Save xinbot/e40556c38c44abf5a3c2224fce2ade91 to your computer and use it in GitHub Desktop.
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();
}
}
@xinbot
Copy link
Copy Markdown
Author

xinbot commented Apr 21, 2026

Full list of available data providers in 2D Sprite package’s Scripting API section

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment