You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
239 lines
7.6 KiB
C#
239 lines
7.6 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using Aseprite;
|
|
using AsepriteImporter.Data;
|
|
using AsepriteImporter.DataProviders;
|
|
using AsepriteImporter.Editors;
|
|
using AsepriteImporter.Importers;
|
|
using AsepriteImporter.Settings;
|
|
using UnityEditor;
|
|
using UnityEditor.U2D.Sprites;
|
|
using Object = UnityEngine.Object;
|
|
|
|
#if UNITY_2020_2_OR_NEWER
|
|
using UnityEditor.AssetImporters;
|
|
#else
|
|
using UnityEditor.Experimental.AssetImporters;
|
|
#endif
|
|
|
|
|
|
|
|
namespace AsepriteImporter
|
|
{
|
|
[ScriptedImporter(1, new[] { "ase", "aseprite" })]
|
|
public class AseFileImporter : ScriptedImporter, ISpriteEditorDataProvider
|
|
{
|
|
[SerializeField] public AseFileImportSettings settings = new AseFileImportSettings();
|
|
[SerializeField] public AseFileTextureImportSettings textureImporterSettings = new AseFileTextureImportSettings();
|
|
[SerializeField] public AseFileAnimationSettings[] animationSettings = new AseFileAnimationSettings[0];
|
|
|
|
[SerializeField] internal Texture2D texture;
|
|
[SerializeField] internal AseFileSpriteImportData[] spriteImportData;
|
|
[SerializeField] internal SpriteRect[] spriteRects;
|
|
|
|
[SerializeField] internal int selectedImporter;
|
|
|
|
private List<ImporterVariant> importerVariants = new List<ImporterVariant>();
|
|
|
|
public Texture2D Texture => texture;
|
|
public AseFileSpriteImportData[] SpriteImportData => spriteImportData;
|
|
|
|
public ImporterVariant SelectedImporter
|
|
{
|
|
get
|
|
{
|
|
if (selectedImporter >= 0 && selectedImporter < importerVariants.Count)
|
|
return importerVariants[selectedImporter];
|
|
else
|
|
{
|
|
selectedImporter = 0;
|
|
return importerVariants[selectedImporter];
|
|
}
|
|
}
|
|
}
|
|
|
|
public SpriteImporter CurrentImporter
|
|
{
|
|
get
|
|
{
|
|
switch (settings.importType)
|
|
{
|
|
case AseFileImportType.Sprite:
|
|
return SelectedImporter.SpriteImporter;
|
|
case AseFileImportType.Tileset:
|
|
return SelectedImporter.TileSetImporter;
|
|
}
|
|
|
|
return SelectedImporter.SpriteImporter;
|
|
}
|
|
}
|
|
|
|
public string[] ImporterNames
|
|
{
|
|
get
|
|
{
|
|
string[] names = new string[importerVariants.Count];
|
|
for (int i = 0; i < names.Length; ++i)
|
|
names[i] = importerVariants[i].Name;
|
|
|
|
return names;
|
|
}
|
|
}
|
|
|
|
public AseFileImporter()
|
|
{
|
|
var generatedImporter = new ImporterVariant("Generated (Subfolders)", new GeneratedSpriteImporter(this), new GeneratedTileImporter(this), new GeneratedImporterEditor());
|
|
var bundledImporter = new ImporterVariant("Bundled (preview)", new BundledSpriteImporter(this), new GeneratedTileImporter(this), new BundledImporterEditor());
|
|
var noneImporter = new ImporterVariant("None", null, null, null);
|
|
|
|
importerVariants.Add(generatedImporter);
|
|
// importerVariants.Add(bundledImporter);
|
|
importerVariants.Add(noneImporter);
|
|
}
|
|
|
|
public override void OnImportAsset(AssetImportContext ctx)
|
|
{
|
|
if (CurrentImporter == null)
|
|
{
|
|
return;
|
|
}
|
|
texture = null;
|
|
|
|
name = GetFileName(ctx.assetPath);
|
|
AseFile file = ReadAseFile(ctx.assetPath);
|
|
|
|
CurrentImporter.Import(ctx, file);
|
|
|
|
CleanUp();
|
|
}
|
|
|
|
private void CleanUp()
|
|
{
|
|
bool clearSprites = CurrentImporter.Sprites == null;
|
|
|
|
foreach (var animationSetting in animationSettings)
|
|
{
|
|
for (int i = 0; i < animationSetting.sprites.Length; ++i)
|
|
{
|
|
if (clearSprites)
|
|
{
|
|
animationSetting.sprites[i] = null;
|
|
continue;
|
|
}
|
|
|
|
if (!CurrentImporter.Sprites.Contains(animationSetting.sprites[i]))
|
|
animationSetting.sprites[i] = null;
|
|
}
|
|
}
|
|
}
|
|
|
|
private string GetFileName(string assetPath)
|
|
{
|
|
var parts = assetPath.Split('/');
|
|
var filename = parts[parts.Length - 1];
|
|
return filename.Substring(0, filename.LastIndexOf('.'));
|
|
}
|
|
|
|
private static AseFile ReadAseFile(string assetPath)
|
|
{
|
|
var fileStream = new FileStream(assetPath, FileMode.Open, FileAccess.Read);
|
|
var aseFile = new AseFile(fileStream);
|
|
fileStream.Close();
|
|
return aseFile;
|
|
}
|
|
|
|
|
|
|
|
#region ISpriteEditorDataProvider implementation
|
|
|
|
private AsepriteTextureDataProvider textureDataProvider;
|
|
private AsepriteOutlineDataProvider outlineDataProvider;
|
|
|
|
|
|
public SpriteRect[] GetSpriteRects()
|
|
{
|
|
List<SpriteRect> spriteRects = new List<SpriteRect>();
|
|
|
|
foreach (AseFileSpriteImportData importData in SpriteImportData)
|
|
{
|
|
spriteRects.Add(new SpriteRect()
|
|
{
|
|
spriteID = ConvertStringToGUID(importData.spriteID),
|
|
alignment = importData.alignment,
|
|
border = importData.border,
|
|
name = importData.name,
|
|
pivot = importData.pivot,
|
|
rect = importData.rect
|
|
});
|
|
}
|
|
|
|
this.spriteRects = spriteRects.ToArray();
|
|
return this.spriteRects;
|
|
}
|
|
|
|
public void SetSpriteRects(SpriteRect[] spriteRects)
|
|
{
|
|
this.spriteRects = spriteRects;
|
|
}
|
|
|
|
public void Apply()
|
|
{
|
|
CurrentImporter.Apply();
|
|
}
|
|
|
|
public void InitSpriteEditorDataProvider()
|
|
{
|
|
textureDataProvider = new AsepriteTextureDataProvider(this);
|
|
outlineDataProvider = new AsepriteOutlineDataProvider(this);
|
|
}
|
|
|
|
public T GetDataProvider<T>() where T : class
|
|
{
|
|
if (typeof(T) == typeof(ITextureDataProvider))
|
|
return textureDataProvider as T;
|
|
|
|
if (typeof(T) == typeof(ISpriteOutlineDataProvider))
|
|
return outlineDataProvider as T;
|
|
|
|
if (typeof(T) == typeof(ISpriteEditorDataProvider))
|
|
return this as T;
|
|
|
|
Debug.Log(typeof(T).Name + " not found");
|
|
return null;
|
|
}
|
|
|
|
public bool HasDataProvider(Type type)
|
|
{
|
|
|
|
if (type == typeof(ITextureDataProvider))
|
|
return true;
|
|
|
|
if (type == typeof(ISpriteOutlineDataProvider))
|
|
return true;
|
|
|
|
//Debug.Log("Does not support" + type.Name);
|
|
return false;
|
|
}
|
|
|
|
public SpriteImportMode spriteImportMode => CurrentImporter.spriteImportMode;
|
|
public float pixelsPerUnit => CurrentImporter.pixelsPerUnit;
|
|
public Object targetObject => CurrentImporter.targetObject;
|
|
|
|
#endregion
|
|
|
|
|
|
private GUID ConvertStringToGUID(string guidString)
|
|
{
|
|
if (!GUID.TryParse(guidString, out GUID guid))
|
|
{
|
|
guid = GUID.Generate();
|
|
}
|
|
|
|
return guid;
|
|
}
|
|
}
|
|
}
|