// [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
}