// [UNITY-SKILL:SPRITEATLAS] using UnityEditor.U2D; using UnityEngine; using Unity.Collections; /// /// Base class for implementing custom sprite packing algorithms. /// Extend this class to create specialized packing strategies beyond Unity's default algorithms. /// public class CustomSpritePacker : ScriptablePacker { /// /// Required: Implement packing logic. /// This method is called during atlas building to determine sprite positions. /// /// Packing configuration settings /// Texture settings for the atlas /// Input data containing sprites, textures, and vertex data /// True if packing succeeded, false otherwise public override bool Pack(SpriteAtlasPackingSettings config, SpriteAtlasTextureSettings setting, PackerData input) { // Access input data NativeArray sprites = input.spriteData; NativeArray textures = input.textureData; NativeArray colors = input.colorData; NativeArray indices = input.indexData; NativeArray vertices = input.vertexData; // Implement packing algorithm for (int i = 0; i < sprites.Length; i++) { SpriteData sprite = sprites[i]; // Set output position and page sprite.output.x = CalculateX(i); sprite.output.y = CalculateY(i); sprite.output.page = CalculatePage(i); sprite.output.rot = PackTransform.None; sprites[i] = sprite; } return true; // Return true if packing succeeded } /// /// Optional: Implement fitting without texture creation. /// This method is used to determine if sprites fit within the atlas bounds. /// protected override bool Fit(SpriteAtlasPackingSettings config, SpriteAtlasTextureSettings setting, PackerData input) { // Implement fit algorithm (optional) return false; } #region Helper Methods private int CalculateX(int index) { // Custom X position calculation return index * 100; } private int CalculateY(int index) { // Custom Y position calculation return (index / 10) * 100; } private int CalculatePage(int index) { // Page assignment logic return index / 64; } #endregion }