← Files UnityARCHIVED FILE

skills/manage-sprite-atlas/resources/scriptablepacker.cs

2.58 KB · Oct 4, 2026 · 12:33 UTC

↓ Download file

// [UNITY-SKILL:SPRITEATLAS]
using UnityEditor.U2D;
using UnityEngine;
using Unity.Collections;

/// <summary>
/// Base class for implementing custom sprite packing algorithms.
/// Extend this class to create specialized packing strategies beyond Unity's default algorithms.
/// </summary>
public class CustomSpritePacker : ScriptablePacker
{
    /// <summary>
    /// Required: Implement packing logic.
    /// This method is called during atlas building to determine sprite positions.
    /// </summary>
    /// <param name="config">Packing configuration settings</param>
    /// <param name="setting">Texture settings for the atlas</param>
    /// <param name="input">Input data containing sprites, textures, and vertex data</param>
    /// <returns>True if packing succeeded, false otherwise</returns>
    public override bool Pack(SpriteAtlasPackingSettings config,
                             SpriteAtlasTextureSettings setting,
                             PackerData input)
    {
        // Access input data
        NativeArray<SpriteData> sprites = input.spriteData;
        NativeArray<TextureData> textures = input.textureData;
        NativeArray<Color32> colors = input.colorData;
        NativeArray<int> indices = input.indexData;
        NativeArray<Vector2> 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
    }

    /// <summary>
    /// Optional: Implement fitting without texture creation.
    /// This method is used to determine if sprites fit within the atlas bounds.
    /// </summary>
    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
}

SHA-256: d3c44544938f49d1f0e4d44b2da74867d50ab50125b09253f380315239113f77