Files
stas-barecky/Library/PackageCache/com.unity.2d.tooling@55ff0338cdce/Samples~/Sample Sprite Atlas Report

Sample Sprite Atlas Report

This sample demonstrates how to create a custom report for the Sprite Atlas Analyzer by implementing a report that identifies sprites included in multiple Sprite Atlases.

Overview

The sample consists of three main components:

  1. SpriteInMultipleAtlasIssue.cs - The main report class that inherits from AnalyzerIssueReportBase
  2. SpriteInMultipleAtlasCellData.cs - A data structure for representing cell data in the report UI
  3. SpriteInMultipleAtlasIssue.uss - Styling for the report UI

How to Create a New Report

To create your own custom report based on this sample:

1. Create a Report Class

Create a class that inherits from AnalyzerIssueReportBase:

class YourCustomReport : AnalyzerIssueReportBase
{
    public YourCustomReport() : base(new [] {typeof(SpriteAtlasDataSource)})
    {
        SetReportListItemName("Your Report Name");
        SetReportListemCount("0");
        // Setup your UI here
    }
}

2. Define Required Properties

Implement the required abstract properties:

public override VisualElement reportContent => m_ReportContent;
public override VisualElement settingsContent => null; // or your settings UI
public override string reportTitle => "Your Report Title";

3. Handle Data Source Changes

Override OnReportDataSourceChanged to process data when it becomes available:

protected override async void OnReportDataSourceChanged(IReportDataSource reportDataSource)
{
    if (reportDataSource is SpriteAtlasDataSource dataSource)
    {
        isFilteringReport = true;
        var filteredData = await ProcessData(dataSource.data);
        // Update your UI with the processed data
        SetReportListemCount($"{filteredData.Count}");
    }
}

4. Create Data Processing Logic

Implement your data filtering and processing logic:

async Task<List<TreeViewItemData<YourDataType>>> ProcessData(List<EditorAtlasInfo> dataSource)
{
    List<TreeViewItemData<YourDataType>> result = new();

    // Your custom logic here
    for(int i = 0; i < dataSource.Count; ++i)
    {
        var atlasInfo = dataSource[i];
        await Task.Delay(10); // Yield control periodically for large datasets

        // Process atlas data according to your requirements
    }

    return result;
}

5. Define Cell Data Structure

Create a data structure for your UI cells:

[Serializable]
record YourCellData
{
    public string name;
    public string icon;
    public string objectGlobalID;
    // Add other properties as needed
}

6. Setup UI Elements

Configure your MultiColumnTreeView with appropriate columns:

void SetupReportContent()
{
    var columns = new Columns()
    {
        new Column()
        {
            name = "Name",
            title = "Name",
            width = Length.Pixels(100),
            makeCell = () => /* Create your cell UI */,
            bindCell = (e, i) => /* Bind data to cell */
        }
        // Add more columns as needed
    };

    m_ReportContent = new MultiColumnTreeView(columns);
    m_ReportContent.selectionChanged += OnSelectionChanged;
}

Key Features Demonstrated

  • Data Source Integration: Uses SpriteAtlasDataSource to access Sprite Atlas data
  • Asynchronous Processing: Handles large datasets without blocking the UI
  • Multi-Column Tree View: Displays hierarchical data with custom columns
  • Object Selection: Integrates with Unity's Inspector for selecting objects
  • Custom Styling: Uses USS files for custom UI appearance
  • Global Object ID Handling: Converts between global IDs and Unity objects

Notes

This sample uses internal APIs from the package which are subject to change in future versions.