From 84460b8d50236cfbdd5032f117825f333943deed Mon Sep 17 00:00:00 2001 From: yu takahashi Date: Mon, 10 Feb 2020 15:42:34 +0900 Subject: [PATCH] add applying slice option --- .../Editor/AnimationImporter.cs | 3 +- .../Editor/AnimationImporterWindow.cs | 22 ++++++---- .../Editor/Aseprite/AsepriteImporter.cs | 41 ++++++++++++++----- .../Config/AnimationImporterSharedConfig.cs | 22 ++++++++-- .../Editor/Config/PreviousImportSettings.cs | 33 ++++++++------- .../ImportedData/ImportedAnimationFrame.cs | 2 + .../ImportedData/ImportedAnimationSheet.cs | 25 +++++++---- 7 files changed, 103 insertions(+), 45 deletions(-) diff --git a/Assets/AnimationImporter/Editor/AnimationImporter.cs b/Assets/AnimationImporter/Editor/AnimationImporter.cs index 3698b0b..a23732f 100644 --- a/Assets/AnimationImporter/Editor/AnimationImporter.cs +++ b/Assets/AnimationImporter/Editor/AnimationImporter.cs @@ -469,6 +469,7 @@ private void CreateSprites(ImportedAnimationSheet animationSheet, AnimationImpor // create sub sprites for this file according to the AsepriteAnimationInfo importer.spritesheet = animationSheet.GetSpriteSheet( + sharedData.applySliceParameter, sharedData.spriteAlignment, sharedData.spriteAlignmentCustomX, sharedData.spriteAlignmentCustomY); @@ -476,7 +477,7 @@ private void CreateSprites(ImportedAnimationSheet animationSheet, AnimationImpor // reapply old import settings (pivot settings for sprites) if (animationSheet.hasPreviousTextureImportSettings) { - animationSheet.previousImportSettings.ApplyPreviousTextureImportSettings(importer); + animationSheet.previousImportSettings.ApplyPreviousTextureImportSettings(importer, sharedData.applySliceParameter); } // these values will be set in any case, not influenced by previous import settings diff --git a/Assets/AnimationImporter/Editor/AnimationImporterWindow.cs b/Assets/AnimationImporter/Editor/AnimationImporterWindow.cs index 6ef8feb..164963c 100644 --- a/Assets/AnimationImporter/Editor/AnimationImporterWindow.cs +++ b/Assets/AnimationImporter/Editor/AnimationImporterWindow.cs @@ -144,13 +144,21 @@ sprite values importer.sharedData.targetObjectType = (AnimationTargetObjectType)EditorGUILayout.EnumPopup("Target Object", importer.sharedData.targetObjectType); - importer.sharedData.spriteAlignment = (SpriteAlignment)EditorGUILayout.EnumPopup("Sprite Alignment", importer.sharedData.spriteAlignment); - - if (importer.sharedData.spriteAlignment == SpriteAlignment.Custom) - { - importer.sharedData.spriteAlignmentCustomX = EditorGUILayout.Slider("x", importer.sharedData.spriteAlignmentCustomX, 0, 1f); - importer.sharedData.spriteAlignmentCustomY = EditorGUILayout.Slider("y", importer.sharedData.spriteAlignmentCustomY, 0, 1f); - } + EditorGUILayout.BeginHorizontal(); + importer.sharedData.applySliceParameter = EditorGUILayout.Toggle("Apply Slice Parameter", importer.sharedData.applySliceParameter); + EditorGUILayout.EndHorizontal(); + + // no longer need setting SpriteAlignment and \pivot when Apply Slice Parameter + if (!importer.sharedData.applySliceParameter) + { + importer.sharedData.spriteAlignment = (SpriteAlignment)EditorGUILayout.EnumPopup("Sprite Alignment", importer.sharedData.spriteAlignment); + + if (importer.sharedData.spriteAlignment == SpriteAlignment.Custom) + { + importer.sharedData.spriteAlignmentCustomX = EditorGUILayout.Slider("x", importer.sharedData.spriteAlignmentCustomX, 0, 1f); + importer.sharedData.spriteAlignmentCustomY = EditorGUILayout.Slider("y", importer.sharedData.spriteAlignmentCustomY, 0, 1f); + } + } importer.sharedData.spritePixelsPerUnit = EditorGUILayout.FloatField("Sprite Pixels per Unit", importer.sharedData.spritePixelsPerUnit); diff --git a/Assets/AnimationImporter/Editor/Aseprite/AsepriteImporter.cs b/Assets/AnimationImporter/Editor/Aseprite/AsepriteImporter.cs index 1ffce24..0828c75 100644 --- a/Assets/AnimationImporter/Editor/Aseprite/AsepriteImporter.cs +++ b/Assets/AnimationImporter/Editor/Aseprite/AsepriteImporter.cs @@ -1,5 +1,6 @@ using UnityEngine; using System; +using System.Linq; using System.Collections; using System.Collections.Generic; using Random = UnityEngine.Random; @@ -121,7 +122,7 @@ private static ImportedAnimationSheet CreateAnimationSheetFromMetaData(Animation private static bool CreateSpriteAtlasAndMetaFile(AnimationImportJob job) { char delimiter = '\"'; - string parameters = "--data " + delimiter + job.name + ".json" + delimiter + " --sheet " + delimiter + job.name + ".png" + delimiter + " --sheet-pack --list-tags --format json-array " + delimiter + job.fileName + delimiter; + string parameters = "--data " + delimiter + job.name + ".json" + delimiter + " --sheet " + delimiter + job.name + ".png" + delimiter + " --sheet-pack --list-tags --list-slices --format json-array " + delimiter + job.fileName + delimiter; if (!string.IsNullOrEmpty(job.additionalCommandLineArguments)) { @@ -278,8 +279,9 @@ private static bool GetAnimationsFromJSON(ImportedAnimationSheet animationSheet, } private static bool GetFramesFromJSON(ImportedAnimationSheet animationSheet, JSONObject root) - { - var list = root["frames"].Array; + { + var list = root["frames"].Array; + var sliceParameter = root["meta"].Obj["slices"]?.Array[0]; if (list == null) { @@ -288,17 +290,34 @@ private static bool GetFramesFromJSON(ImportedAnimationSheet animationSheet, JSO return false; } - foreach (var item in list) + for (var index = 0; index < list.Length; index++) { ImportedAnimationFrame frame = new ImportedAnimationFrame(); - var frameValues = item.Obj["frame"].Obj; - frame.width = (int)frameValues["w"].Number; - frame.height = (int)frameValues["h"].Number; - frame.x = (int)frameValues["x"].Number; - frame.y = animationSheet.height - (int)frameValues["y"].Number - frame.height; // unity has a different coord system - - frame.duration = (int)item.Obj["duration"].Number; + var frameValues = list[index].Obj["frame"].Obj; + var assighnedSliceParameter = sliceParameter?.Obj["keys"].Array.FirstOrDefault(s => s.Obj["frame"].Number == index); + + frame.width = assighnedSliceParameter != null ? + (int)assighnedSliceParameter.Obj["bounds"].Obj["w"].Number : + (int)frameValues["w"].Number; + frame.height = assighnedSliceParameter != null ? + (int)assighnedSliceParameter.Obj["bounds"].Obj["h"].Number : + (int)frameValues["h"].Number; + frame.x = assighnedSliceParameter != null ? + (int)(frameValues["x"].Number + assighnedSliceParameter.Obj["bounds"].Obj["x"].Number) : + (int)frameValues["x"].Number; + var y = assighnedSliceParameter != null ? + (int)(frameValues["y"].Number + assighnedSliceParameter.Obj["bounds"].Obj["y"].Number) : + (int)frameValues["y"].Number; + frame.y = animationSheet.height - y - frame.height; // unity has a different coord system + frame.pivotX = assighnedSliceParameter != null ? + (int)assighnedSliceParameter.Obj["pivot"].Obj["x"].Number : + frame.pivotX; + frame.pivotY = assighnedSliceParameter != null ? + (int)assighnedSliceParameter.Obj["pivot"].Obj["y"].Number : + frame.pivotY; + + frame.duration = (int)list[index].Obj["duration"].Number; animationSheet.frames.Add(frame); } diff --git a/Assets/AnimationImporter/Editor/Config/AnimationImporterSharedConfig.cs b/Assets/AnimationImporter/Editor/Config/AnimationImporterSharedConfig.cs index 9c9f1ff..f4b8cd1 100644 --- a/Assets/AnimationImporter/Editor/Config/AnimationImporterSharedConfig.cs +++ b/Assets/AnimationImporter/Editor/Config/AnimationImporterSharedConfig.cs @@ -54,9 +54,23 @@ public AnimationTargetObjectType targetObjectType { _targetObjectType = value; } - } - - [SerializeField] + } + + [SerializeField] + private bool _applySliceParameter = false; + public bool applySliceParameter + { + get + { + return _applySliceParameter; + } + set + { + _applySliceParameter = value; + } + } + + [SerializeField] private SpriteAlignment _spriteAlignment = SpriteAlignment.BottomCenter; public SpriteAlignment spriteAlignment { @@ -70,7 +84,7 @@ public SpriteAlignment spriteAlignment } } - [SerializeField] + [SerializeField] private float _spriteAlignmentCustomX = 0; public float spriteAlignmentCustomX { diff --git a/Assets/AnimationImporter/Editor/Config/PreviousImportSettings.cs b/Assets/AnimationImporter/Editor/Config/PreviousImportSettings.cs index 4d9c48a..d4e07cc 100644 --- a/Assets/AnimationImporter/Editor/Config/PreviousImportSettings.cs +++ b/Assets/AnimationImporter/Editor/Config/PreviousImportSettings.cs @@ -39,28 +39,33 @@ public void GetTextureImportSettings(string filename) } } - public void ApplyPreviousTextureImportSettings(TextureImporter importer) + public void ApplyPreviousTextureImportSettings(TextureImporter importer, bool isAppliedSliceParameter) { if (!_hasPreviousTextureImportSettings|| importer == null) { return; } - // apply old pivot point settings - // we assume every sprite should have the same pivot point - if (_previousFirstSprite.HasValue) - { - var spritesheet = importer.spritesheet; // read values + // I assume every SLICED sprite shourd have the new pivot point + if (isAppliedSliceParameter) + { + return; + } + // apply old pivot point settings + // we assume every sprite should have the same pivot point + if (_previousFirstSprite.HasValue) + { + var spritesheet = importer.spritesheet; // read values - for (int i = 0; i < spritesheet.Length; i++) - { - spritesheet[i].alignment = _previousFirstSprite.Value.alignment; - spritesheet[i].pivot = _previousFirstSprite.Value.pivot; - } + for (int i = 0; i < spritesheet.Length; i++) + { + spritesheet[i].alignment = _previousFirstSprite.Value.alignment; + spritesheet[i].pivot = _previousFirstSprite.Value.pivot; + } - importer.spritesheet = spritesheet; // write values - } - } + importer.spritesheet = spritesheet; // write values + } + } // ================================================================================ // analyzing animations diff --git a/Assets/AnimationImporter/Editor/ImportedData/ImportedAnimationFrame.cs b/Assets/AnimationImporter/Editor/ImportedData/ImportedAnimationFrame.cs index 44dc4c1..575cf59 100644 --- a/Assets/AnimationImporter/Editor/ImportedData/ImportedAnimationFrame.cs +++ b/Assets/AnimationImporter/Editor/ImportedData/ImportedAnimationFrame.cs @@ -25,6 +25,8 @@ public string name public int y; public int width; public int height; + public float pivotX; + public float pivotY; public int duration; // in milliseconds as part of an animation diff --git a/Assets/AnimationImporter/Editor/ImportedData/ImportedAnimationSheet.cs b/Assets/AnimationImporter/Editor/ImportedData/ImportedAnimationSheet.cs index 774d4ff..9c6c0a3 100644 --- a/Assets/AnimationImporter/Editor/ImportedData/ImportedAnimationSheet.cs +++ b/Assets/AnimationImporter/Editor/ImportedData/ImportedAnimationSheet.cs @@ -238,7 +238,7 @@ private Regex GetRegexFromNonLoopingAnimationNames(List value) // Sprite Data // -------------------------------------------------------------------------------- - public SpriteMetaData[] GetSpriteSheet(SpriteAlignment spriteAlignment, float customX, float customY) + public SpriteMetaData[] GetSpriteSheet(bool isAppliedSliceParameter, SpriteAlignment spriteAlignment, float customX, float customY) { SpriteMetaData[] metaData = new SpriteMetaData[frames.Count]; @@ -247,13 +247,22 @@ public SpriteMetaData[] GetSpriteSheet(SpriteAlignment spriteAlignment, float cu ImportedAnimationFrame spriteInfo = frames[i]; SpriteMetaData spriteMetaData = new SpriteMetaData(); - // sprite alignment - spriteMetaData.alignment = (int)spriteAlignment; - if (spriteAlignment == SpriteAlignment.Custom) - { - spriteMetaData.pivot.x = customX; - spriteMetaData.pivot.y = customY; - } + // sprite alignment + spriteMetaData.alignment = (int)spriteAlignment; + if (isAppliedSliceParameter) + { + spriteMetaData.alignment = (int)SpriteAlignment.Custom; + spriteMetaData.pivot.x = spriteInfo.pivotX / spriteInfo.width; + spriteMetaData.pivot.y = (spriteInfo.height - spriteInfo.pivotY) / spriteInfo.height; + } + else + { + if (spriteAlignment == SpriteAlignment.Custom) + { + spriteMetaData.pivot.x = customX; + spriteMetaData.pivot.y = customY; + } + } spriteMetaData.name = spriteInfo.name; spriteMetaData.rect = new Rect(spriteInfo.x, spriteInfo.y, spriteInfo.width, spriteInfo.height);