197 lines
6.1 KiB
Markdown
197 lines
6.1 KiB
Markdown
|
# Sprite Editor Data Provider API
|
||
|
|
||
|
By using the Sprite Editor Data Provider API, the user can add, change and remove Sprite data in a custom importer or editor tool. Refer to the code examples below to see how the API is applied.
|
||
|
|
||
|
**Important:** Some of the following examples contains an additional section of code which is needed if you are using Unity 2021.2 or newer. If you are using Unity 2021.1 or older, you should remove the indicated section to ensure the code compiles properly.
|
||
|
|
||
|
## How to get ISpriteEditorDataProvider instances
|
||
|
|
||
|
The following examples show you how to use the API to get each respective instance.
|
||
|
|
||
|
### Importer
|
||
|
|
||
|
```C#
|
||
|
using UnityEditor;
|
||
|
using UnityEditor.U2D.Sprites;
|
||
|
using UnityEngine;
|
||
|
|
||
|
public class MyAssetPostProcessor : AssetPostprocessor
|
||
|
{
|
||
|
private void OnPreprocessTexture()
|
||
|
{
|
||
|
var factory = new SpriteDataProviderFactories();
|
||
|
factory.Init();
|
||
|
var dataProvider = factory.GetSpriteEditorDataProviderFromObject(assetImporter);
|
||
|
dataProvider.InitSpriteEditorDataProvider();
|
||
|
|
||
|
/* Use the data provider */
|
||
|
|
||
|
// Apply the changes made to the data provider
|
||
|
dataProvider.Apply();
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### Texture
|
||
|
|
||
|
```C#
|
||
|
using UnityEditor;
|
||
|
using UnityEditor.U2D.Sprites;
|
||
|
using UnityEngine;
|
||
|
|
||
|
public static class MyCustomTool
|
||
|
{
|
||
|
[MenuItem("Custom/Update Sprite Settings")]
|
||
|
static void UpdateSettings()
|
||
|
{
|
||
|
foreach (var obj in Selection.objects)
|
||
|
{
|
||
|
if (obj is Texture2D)
|
||
|
{
|
||
|
var factory = new SpriteDataProviderFactories();
|
||
|
factory.Init();
|
||
|
var dataProvider = factory.GetSpriteEditorDataProviderFromObject(obj);
|
||
|
dataProvider.InitSpriteEditorDataProvider();
|
||
|
|
||
|
/* Use the data provider */
|
||
|
|
||
|
// Apply the changes made to the data provider
|
||
|
dataProvider.Apply();
|
||
|
|
||
|
// Reimport the asset to have the changes applied
|
||
|
var assetImporter = dataProvider.targetObject as AssetImporter;
|
||
|
assetImporter.SaveAndReimport();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## How to add Sprites
|
||
|
|
||
|
```C#
|
||
|
static void AddSprite(ISpriteEditorDataProvider dataProvider)
|
||
|
{
|
||
|
// Define the new Sprite Rect
|
||
|
var newSprite = new SpriteRect()
|
||
|
{
|
||
|
name = "MyNewSprite",
|
||
|
spriteID = GUID.Generate(),
|
||
|
rect = new Rect(0, 0, 32, 32)
|
||
|
};
|
||
|
// Add the Sprite Rect to the list of existing Sprite Rects
|
||
|
var spriteRects = dataProvider.GetSpriteRects().ToList();
|
||
|
spriteRects.Add(newSprite);
|
||
|
|
||
|
// Write the updated data back to the data provider
|
||
|
dataProvider.SetSpriteRects(spriteRects.ToArray());
|
||
|
|
||
|
// Note: This section is only for Unity 2021.2 and newer
|
||
|
// Register the new Sprite Rect's name and GUID with the ISpriteNameFileIdDataProvider
|
||
|
var spriteNameFileIdDataProvider = dataProvider.GetDataProvider<ISpriteNameFileIdDataProvider>();
|
||
|
var nameFileIdPairs = spriteNameFileIdDataProvider.GetNameFileIdPairs().ToList();
|
||
|
nameFileIdPairs.Add(new SpriteNameFileIdPair(newSprite.name, newSprite.spriteID));
|
||
|
spriteNameFileIdDataProvider.SetNameFileIdPairs(nameFileIdPairs);
|
||
|
// End of Unity 2021.2 and newer section
|
||
|
|
||
|
// Apply the changes
|
||
|
dataProvider.Apply();
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## How to change Sprite data
|
||
|
|
||
|
```C#
|
||
|
static void SetPivot(ISpriteEditorDataProvider dataProvider)
|
||
|
{
|
||
|
// Get all the existing Sprites
|
||
|
var spriteRects = dataProvider.GetSpriteRects();
|
||
|
|
||
|
// Loop over all Sprites and update the pivots
|
||
|
foreach (var rect in spriteRects)
|
||
|
{
|
||
|
rect.pivot = new Vector2(0.1f, 0.2f);
|
||
|
rect.alignment = SpriteAlignment.Custom;
|
||
|
}
|
||
|
|
||
|
// Write the updated data back to the data provider
|
||
|
dataProvider.SetSpriteRects(spriteRects);
|
||
|
|
||
|
// Apply the changes
|
||
|
dataProvider.Apply();
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## How to remove Sprites
|
||
|
|
||
|
```C#
|
||
|
static void RemoveSprite(ISpriteEditorDataProvider dataProvider, string spriteName)
|
||
|
{
|
||
|
// Get all the existing Sprites and look for the Sprite with the selected name
|
||
|
var spriteRects = dataProvider.GetSpriteRects().ToList();
|
||
|
var index = spriteRects.FindIndex(x => x.name == spriteName);
|
||
|
|
||
|
// Remove the entry of the Sprite if found
|
||
|
if (index >= 0)
|
||
|
spriteRects.RemoveAt(index);
|
||
|
|
||
|
// Write the updated data back to the data provider
|
||
|
dataProvider.SetSpriteRects(spriteRects.ToArray());
|
||
|
|
||
|
// Note: This section is only for Unity 2021.2 and newer
|
||
|
// Get all the existing SpriteName & FileId pairs and look for the Sprite with the selected name
|
||
|
var spriteNameFileIdDataProvider = dataProvider.GetDataProvider<ISpriteNameFileIdDataProvider>();
|
||
|
var nameFileIdPairs = spriteNameFileIdDataProvider.GetNameFileIdPairs().ToList();
|
||
|
index = nameFileIdPairs.FindIndex(x => x.name == spriteName);
|
||
|
|
||
|
// Remove the entry of the Sprite if found
|
||
|
if (index >= 0)
|
||
|
nameFileIdPairs.RemoveAt(index);
|
||
|
|
||
|
spriteNameFileIdDataProvider.SetNameFileIdPairs(nameFileIdPairs);
|
||
|
// End of Unity 2021.2 and newer section
|
||
|
|
||
|
// Apply the changes
|
||
|
dataProvider.Apply();
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## How to update Outline data
|
||
|
|
||
|
```C#
|
||
|
static void SetOutline(ISpriteEditorDataProvider dataProvider)
|
||
|
{
|
||
|
// Get the ISpriteOutlineDataProvider
|
||
|
var outlineDataProvider = dataProvider.GetDataProvider<ISpriteOutlineDataProvider>();
|
||
|
|
||
|
// Loop over all Sprites and set their outline to a quad
|
||
|
var spriteRects = dataProvider.GetSpriteRects();
|
||
|
foreach (var spriteRect in spriteRects)
|
||
|
{
|
||
|
var halfWidth = spriteRect.rect.width / 2f;
|
||
|
var halfHeight = spriteRect.rect.height / 2f;
|
||
|
|
||
|
var quadOutline = new Vector2[4]
|
||
|
{
|
||
|
new Vector2(-halfWidth, -halfHeight),
|
||
|
new Vector2(-halfWidth, halfHeight),
|
||
|
new Vector2(halfWidth, halfHeight),
|
||
|
new Vector2(halfWidth, -halfHeight)
|
||
|
};
|
||
|
|
||
|
var outlines = new List<Vector2[]>();
|
||
|
outlines.Add(quadOutline);
|
||
|
|
||
|
var spriteGuid = spriteRect.spriteID;
|
||
|
outlineDataProvider.SetOutlines(spriteGuid, outlines);
|
||
|
}
|
||
|
|
||
|
// Apply the changes
|
||
|
dataProvider.Apply();
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## Additional resources
|
||
|
|
||
|
- Full list of other available data providers is available in the package's [Scripting API section](xref:UnityEditor.U2D.Sprites).
|