// [UNITY-SKILL:SPRITEATLAS] using UnityEditor; using UnityEditor.U2D; using UnityEngine; /// /// Demonstrates enabling and configuring Sprite Packer for SpriteAtlases. /// Proper packing configuration is essential for efficient atlas usage. /// public static class EnableSpritePackingExample { /// /// Enables Sprite Packer mode in Project Settings. /// This must be done before creating atlases. /// public static void EnableSpritePacker() { EditorSettings.spritePackerMode = SpritePackerMode.SpriteAtlasV2; Debug.Log("Sprite Packer V2 enabled"); } /// /// Configures packing settings for an atlas. /// Tight packing reduces texture memory usage. /// public static void ConfigurePackingSettings(string atlasPath) { SpriteAtlasImporter importer = AssetImporter.GetAtPath(atlasPath) as SpriteAtlasImporter; if (importer == null) return; // Enable tight packing for better space utilization var packingSettings = importer.packingSettings; packingSettings.enableTightPacking = true; importer.packingSettings = packingSettings; importer.SaveAndReimport(); } /// /// Configures packing settings with rotation enabled. /// Rotation can significantly improve packing density for irregular sprites. /// public static void EnableRotationPacking(string atlasPath) { SpriteAtlasImporter importer = AssetImporter.GetAtPath(atlasPath) as SpriteAtlasImporter; if (importer == null) return; var packingSettings = importer.packingSettings; packingSettings.enableRotation = true; importer.packingSettings = packingSettings; importer.SaveAndReimport(); } /// /// Configures packing settings with padding. /// Add padding to prevent texture bleeding between adjacent sprites. /// public static void ConfigurePackingWithPadding(string atlasPath, int paddingPixels) { SpriteAtlasImporter importer = AssetImporter.GetAtPath(atlasPath) as SpriteAtlasImporter; if (importer == null) return; var packingSettings = importer.packingSettings; packingSettings.padding = 2; importer.packingSettings = packingSettings; importer.SaveAndReimport(); } /// /// Configures packing settings for UI atlases. /// UI sprites typically need consistent positioning without rotation. /// public static void ConfigureUIPacking(string atlasPath) { SpriteAtlasImporter importer = AssetImporter.GetAtPath(atlasPath) as SpriteAtlasImporter; if (importer == null) return; // UI sprites usually shouldn't be rotated var packingSettings = importer.packingSettings; packingSettings.padding = 2; packingSettings.enableTightPacking = false; packingSettings.enableRotation = false; packingSettings.enableAlphaDilation = false; importer.packingSettings = packingSettings; importer.SaveAndReimport(); } /// /// Configures packing settings for character/animation atlases. /// Animation frames need consistent positioning across frames. /// public static void ConfigureAnimationPacking(string atlasPath) { SpriteAtlasImporter importer = AssetImporter.GetAtPath(atlasPath) as SpriteAtlasImporter; if (importer == null) return; // UI sprites usually shouldn't be rotated var packingSettings = importer.packingSettings; packingSettings.padding = 2; packingSettings.enableTightPacking = true; packingSettings.enableRotation = false; packingSettings.enableAlphaDilation = false; importer.packingSettings = packingSettings; importer.SaveAndReimport(); } } /// /// Editor window for batch configuring sprite packing settings. /// public class ConfigurePackingWindow : EditorWindow { private string _atlasFolder = "Assets/Atlases"; private bool _tightPacking = true; private bool _allowRotation = false; private int _padding = 2; [MenuItem("Tools/Configure Sprite Packing")] public static void ShowWindow() { GetWindow("Configure Packing"); } private void OnGUI() { EditorGUILayout.LabelField("Batch Configure Packing", EditorStyles.boldLabel); _atlasFolder = EditorGUILayout.TextField("Atlas Folder", _atlasFolder); _tightPacking = EditorGUILayout.Toggle("Tight Packing", _tightPacking); _allowRotation = EditorGUILayout.Toggle("Allow Rotation", _allowRotation); _padding = EditorGUILayout.IntField("Padding (pixels)", _padding); if (GUILayout.Button("Configure Atlases")) { BatchConfigure(); } } private void BatchConfigure() { string[] guids = AssetDatabase.FindAssets("t:SpriteAtlasAsset", new[] { _atlasFolder }); foreach (string guid in guids) { string path = AssetDatabase.GUIDToAssetPath(guid); SpriteAtlasImporter importer = AssetImporter.GetAtPath(path) as SpriteAtlasImporter; if (importer != null) { var packingSettings = importer.packingSettings; packingSettings.padding = _padding; packingSettings.enableTightPacking = _tightPacking; packingSettings.enableRotation = _allowRotation; packingSettings.enableAlphaDilation = false; importer.packingSettings = packingSettings; importer.SaveAndReimport(); } } Debug.Log($"Configured packing for {guids.Length} atlases"); AssetDatabase.Refresh(); } }