Files
AppleHillsProduction/Assets/Plugins/codeandweb.com/Editor/SpritesheetImporter.cs

124 lines
3.9 KiB
C#

/*
* TexturePacker Importer
* (c) CodeAndWeb GmbH, Saalbaustraße 61, 89233 Neu-Ulm, Germany
*
* Use this script to import sprite sheets generated with TexturePacker.
* For more information see https://www.codeandweb.com/texturepacker/unity
*
*/
using UnityEngine;
using UnityEditor;
// Note: TexturePacker Importer with Unity 2021.2 (or newer) requires the "Sprite 2D" package,
// please make sure that it is part of your Unity project. You can install it using
// Unity's package manager.
#if UNITY_2021_2_OR_NEWER
using UnityEditor.U2D.Sprites;
using System.Collections.Generic;
#endif
namespace TexturePackerImporter
{
public class SpritesheetImporter : AssetPostprocessor
{
void OnPreprocessTexture()
{
TextureImporter importer = assetImporter as TextureImporter;
SheetInfo sheet = TexturePackerImporter.getSheetInfo(importer);
if (sheet != null)
{
Dbg.Log("Updating sprite sheet " + importer.assetPath);
#if UNITY_2021_2_OR_NEWER
updateSprites(importer, sheet);
#else
importer.spritesheet = sheet.metadata;
#endif
}
}
#if UNITY_2021_2_OR_NEWER
private static void updateSprites(TextureImporter importer, SheetInfo sheet)
{
var dataProvider = GetSpriteEditorDataProvider(importer);
var spriteNameFileIdDataProvider = dataProvider.GetDataProvider<ISpriteNameFileIdDataProvider>();
var oldIds = spriteNameFileIdDataProvider.GetNameFileIdPairs();
SpriteRect[] rects = sheetInfoToSpriteRects(sheet);
SpriteNameFileIdPair[] ids = generateSpriteIds(oldIds, rects);
dataProvider.SetSpriteRects(rects);
spriteNameFileIdDataProvider.SetNameFileIdPairs(ids);
dataProvider.Apply();
EditorUtility.SetDirty(importer);
}
private static ISpriteEditorDataProvider GetSpriteEditorDataProvider(TextureImporter importer)
{
var dataProviderFactories = new SpriteDataProviderFactories();
dataProviderFactories.Init();
var dataProvider = dataProviderFactories.GetSpriteEditorDataProviderFromObject(importer);
dataProvider.InitSpriteEditorDataProvider();
return dataProvider;
}
private static SpriteRect[] sheetInfoToSpriteRects(SheetInfo sheet)
{
int spriteCount = sheet.metadata.Length;
SpriteRect[] rects = new SpriteRect[spriteCount];
for (int i = 0; i < spriteCount; i++)
{
SpriteRect sr = rects[i] = new SpriteRect();
SpriteMetaData smd = sheet.metadata[i];
sr.name = smd.name;
sr.rect = smd.rect;
sr.pivot = smd.pivot;
sr.border = smd.border;
sr.alignment = (SpriteAlignment)smd.alignment;
// sr.spriteID not yet initialized, this is done in generateSpriteIds()
}
return rects;
}
private static SpriteNameFileIdPair[] generateSpriteIds(IEnumerable<SpriteNameFileIdPair> oldIds,
SpriteRect[] sprites)
{
SpriteNameFileIdPair[] newIds = new SpriteNameFileIdPair[sprites.Length];
for (int i = 0; i < sprites.Length; i++)
{
sprites[i].spriteID = idForName(oldIds, sprites[i].name);
newIds[i] = new SpriteNameFileIdPair(sprites[i].name, sprites[i].spriteID);
}
return newIds;
}
private static GUID idForName(IEnumerable<SpriteNameFileIdPair> oldIds, string name)
{
foreach (SpriteNameFileIdPair old in oldIds)
{
if (old.name == name)
{
return old.GetFileGUID();
}
}
return GUID.Generate();
}
#endif
}
}