From 6778f058671efded28c19c85cf65b702a1c0e613 Mon Sep 17 00:00:00 2001 From: weathfold Date: Tue, 27 Apr 2021 17:30:27 +0800 Subject: [PATCH] Minor code improvement & usability fixes --- .../Plugins/MetaSprite/Editor/ASEImporter.cs | 12 +- .../Plugins/MetaSprite/Editor/ImportMenu.cs | 28 +- .../MetaSprite/Editor/ImportSettings.cs | 267 +++++++++--------- .../Internal/ASEReimportPostprocessor.cs | 2 +- 4 files changed, 162 insertions(+), 147 deletions(-) diff --git a/Assets/Plugins/MetaSprite/Editor/ASEImporter.cs b/Assets/Plugins/MetaSprite/Editor/ASEImporter.cs index f242d32..2f84e29 100644 --- a/Assets/Plugins/MetaSprite/Editor/ASEImporter.cs +++ b/Assets/Plugins/MetaSprite/Editor/ASEImporter.cs @@ -107,6 +107,12 @@ struct LayerAndProcessor { public static void Import(string path, ImportSettings settings) { + if (!settings.CheckIsValid()) { + var settingsPath = AssetDatabase.GetAssetPath(settings); + Debug.LogError($"Import settings {settingsPath} is invalid, please fix it before importing."); + return; + } + var context = new ImportContext { // file = file, settings = settings, @@ -122,7 +128,7 @@ public static void Import(string path, ImportSettings settings) { context.atlasPath = Path.Combine(settings.atlasOutputDirectory, context.fileNameNoExt + ".png"); if (settings.controllerPolicy == AnimControllerOutputPolicy.CreateOrOverride) - context.animControllerPath = settings.animControllerOutputPath + "/" + settings.baseName + ".controller"; + context.animControllerPath = settings.animControllerOutputDirectory + "/" + settings.baseName + ".controller"; context.animClipDirectory = settings.clipOutputDirectory; // Create paths in advance @@ -250,8 +256,8 @@ static void GenerateAnimClips(ImportContext ctx) { } static void GenerateAnimController(ImportContext ctx) { - if (ctx.animControllerPath == null) { - Debug.LogWarning("No animator controller specified. Controller generation will be ignored"); + if (string.IsNullOrEmpty(ctx.animControllerPath)) { + // Debug.LogWarning("No animator controller specified. Controller generation will be ignored"); return; } diff --git a/Assets/Plugins/MetaSprite/Editor/ImportMenu.cs b/Assets/Plugins/MetaSprite/Editor/ImportMenu.cs index 4b57ad5..c8ee525 100644 --- a/Assets/Plugins/MetaSprite/Editor/ImportMenu.cs +++ b/Assets/Plugins/MetaSprite/Editor/ImportMenu.cs @@ -23,7 +23,13 @@ public static class ImportMenu { [MenuItem("Assets/Aseprite/Import", priority = 60)] static void MenuClicked() { ASEImportProcess.Startup(); - DoImport(GetSelectedAseprites()); + + var selectedAseArr = GetSelectedAseprites(); + if (selectedAseArr.Any(x => !ImportUtil.LoadImportSettings(x))) { + CreateSettingsThenImport(selectedAseArr); + } else { + DoImport(selectedAseArr); + } } [MenuItem("Assets/Aseprite/Import", true)] @@ -68,20 +74,13 @@ static bool ValidateClearFileSettings() { } static void DoImport(DefaultAsset[] assets) { - foreach (var asset in assets) { - var settings = ImportUtil.LoadImportSettings(asset); - if (!settings) { - CreateSettingsThenImport(assets); - return; - } - } - foreach (var asset in assets) { var reference = ImportUtil.LoadImportSettings(asset); - if (reference) + if (!reference) { + Debug.LogWarning("File " + asset.name + " has no import settings, it is ignored."); + } else { ASEImportProcess.Import(AssetDatabase.GetAssetPath(asset), reference.settings); - else - Debug.LogWarning("File " + asset.name + " has empty import settings, it is ignored."); + } } } @@ -102,9 +101,7 @@ static void CreateSettingsThenImport(DefaultAsset[] assets) { var paths = assets.Select(it => ImportUtil.GetImportSettingsPath(it)).ToList(); - window._Init(paths, settings => { foreach (var asset in assets) { - ASEImportProcess.Import(AssetDatabase.GetAssetPath(asset), settings); - } }); + window._Init(paths, settings => { DoImport(assets); }); window.ShowPopup(); } @@ -154,6 +151,7 @@ void OnGUI() { AssetDatabase.CreateAsset(instance, path); } + AssetDatabase.Refresh(); finishedAction(settings); this.Close(); } diff --git a/Assets/Plugins/MetaSprite/Editor/ImportSettings.cs b/Assets/Plugins/MetaSprite/Editor/ImportSettings.cs index 0f40b92..16c2417 100644 --- a/Assets/Plugins/MetaSprite/Editor/ImportSettings.cs +++ b/Assets/Plugins/MetaSprite/Editor/ImportSettings.cs @@ -1,129 +1,140 @@ -using UnityEngine; -using UnityEditor; -using System.IO; - -namespace MetaSprite { - -public enum AnimControllerOutputPolicy { - Skip, CreateOrOverride -} - -[CreateAssetMenu(menuName = "ASE Import Settings")] -public class ImportSettings : ScriptableObject { - - public int ppu = 48; - - public SpriteAlignment alignment; - - public Vector2 customPivot; - - public bool densePacked = true; - - public int border = 3; - - public string baseName = ""; // If left empty, use .ase file name - - public string spriteTarget = ""; - - public string atlasOutputDirectory = ""; - - public string clipOutputDirectory = ""; - - public AnimControllerOutputPolicy controllerPolicy; - - public string animControllerOutputPath; - - public bool automaticReimport; - - public Vector2 PivotRelativePos { - get { - return alignment.GetRelativePos(customPivot); - } - } - -} - -[CustomEditor(typeof(ImportSettings))] -public class ImportSettingsEditor : Editor { - - public override void OnInspectorGUI() { - var settings = (ImportSettings) target; - EditorGUI.BeginChangeCheck(); - - using (new GUILayout.HorizontalScope(EditorStyles.toolbar)) { - GUILayout.Label("Options"); - } - - settings.baseName = EditorGUILayout.TextField("Base Name", settings.baseName); - settings.spriteTarget = EditorGUILayout.TextField("Target Child Object", settings.spriteTarget); - EditorGUILayout.Space(); - - settings.ppu = EditorGUILayout.IntField("Pixel Per Unit", settings.ppu); - settings.alignment = (SpriteAlignment) EditorGUILayout.EnumPopup("Default Align", settings.alignment); - if (settings.alignment == SpriteAlignment.Custom) { - settings.customPivot = EditorGUILayout.Vector2Field("Custom Pivot", settings.customPivot); - } - - settings.densePacked = EditorGUILayout.Toggle("Dense Pack", settings.densePacked); - settings.border = EditorGUILayout.IntField("Border", settings.border); - settings.automaticReimport = EditorGUILayout.Toggle("Automatic Reimport", settings.automaticReimport); - - EditorGUILayout.Space(); - using (new GUILayout.HorizontalScope(EditorStyles.toolbar)) { - GUILayout.Label("Output"); - } - - settings.atlasOutputDirectory = PathSelection("Atlas Directory", settings.atlasOutputDirectory); - settings.clipOutputDirectory = PathSelection("Anim Clip Directory", settings.clipOutputDirectory); - - settings.controllerPolicy = (AnimControllerOutputPolicy) EditorGUILayout.EnumPopup("Anim Controller Policy", settings.controllerPolicy); - if (settings.controllerPolicy == AnimControllerOutputPolicy.CreateOrOverride) { - settings.animControllerOutputPath = PathSelection("Anim Controller Directory", settings.animControllerOutputPath); - } - - if (EditorGUI.EndChangeCheck()) { - EditorUtility.SetDirty(settings); - } - } - - string PathSelection(string id, string path) { - EditorGUILayout.BeginHorizontal(); - EditorGUILayout.PrefixLabel(id); - path = EditorGUILayout.TextField(path); - if (GUILayout.Button("...", GUILayout.Width(30))) { - path = GetAssetPath(EditorUtility.OpenFolderPanel("Select path", path, "")); - } - - EditorGUILayout.EndHorizontal(); - return path; - } - - static string GetAssetPath(string path) { - if (path == null) { - return null; - } - - var projectPath = Application.dataPath; - projectPath = projectPath.Substring(0, projectPath.Length - "/Assets".Length); - path = Remove(path, projectPath); - - if (path.StartsWith("\\") || path.StartsWith("/")) { - path = path.Remove(0, 1); - } - - if (!path.StartsWith("Assets") && !path.StartsWith("/Assets")) { - path = Path.Combine("Assets", path); - } - - path.Replace('\\', '/'); - - return path; - } - - static string Remove(string s, string exactExpression) { - return s.Replace(exactExpression, ""); - } - -} - +using UnityEngine; +using UnityEditor; +using System.IO; +using UnityEngine.Serialization; + +namespace MetaSprite { + +public enum AnimControllerOutputPolicy { + Skip, CreateOrOverride +} + +[CreateAssetMenu(menuName = "ASE Import Settings")] +public class ImportSettings : ScriptableObject { + + public int ppu = 48; + + public SpriteAlignment alignment; + + public Vector2 customPivot; + + public bool densePacked = true; + + public int border = 3; + + public string baseName = ""; // If left empty, use .ase file name + + public string spriteTarget; + + public string atlasOutputDirectory = "Assets/"; + + public string clipOutputDirectory = "Assets/"; + + public AnimControllerOutputPolicy controllerPolicy; + + [FormerlySerializedAs("animControllerOutputPath")] + public string animControllerOutputDirectory = "Assets/"; + + public bool CheckIsValid() + { + return !string.IsNullOrEmpty(baseName); + } + + public Vector2 PivotRelativePos { + get { + return alignment.GetRelativePos(customPivot); + } + } + +} + +[CustomEditor(typeof(ImportSettings))] +public class ImportSettingsEditor : Editor { + private static GUIContent + _textBaseName = new GUIContent("Base Name", "Mainly controls prefix name of generated files."), + _textSpriteTarget = new GUIContent("Target Child Object", "Which child object should the animation target (leave empty for root)"); + + public override void OnInspectorGUI() { + var settings = (ImportSettings) target; + EditorGUI.BeginChangeCheck(); + + using (new GUILayout.HorizontalScope(EditorStyles.toolbar)) { + GUILayout.Label("Options"); + } + + settings.baseName = EditorGUILayout.TextField(_textBaseName, settings.baseName); + if (string.IsNullOrEmpty(settings.baseName)) { + EditorGUILayout.HelpBox("Base name must be specified.", MessageType.Error); + } + + settings.spriteTarget = EditorGUILayout.TextField(_textSpriteTarget, settings.spriteTarget); + EditorGUILayout.Space(); + + settings.ppu = EditorGUILayout.IntField("Pixel Per Unit", settings.ppu); + settings.alignment = (SpriteAlignment) EditorGUILayout.EnumPopup("Default Align", settings.alignment); + if (settings.alignment == SpriteAlignment.Custom) { + settings.customPivot = EditorGUILayout.Vector2Field("Custom Pivot", settings.customPivot); + } + + settings.densePacked = EditorGUILayout.Toggle("Dense Pack", settings.densePacked); + settings.border = EditorGUILayout.IntField("Border", settings.border); + + EditorGUILayout.Space(); + using (new GUILayout.HorizontalScope(EditorStyles.toolbar)) { + GUILayout.Label("Output"); + } + + settings.atlasOutputDirectory = PathSelection("Atlas Directory", settings.atlasOutputDirectory); + settings.clipOutputDirectory = PathSelection("Anim Clip Directory", settings.clipOutputDirectory); + + settings.controllerPolicy = (AnimControllerOutputPolicy) EditorGUILayout.EnumPopup("Anim Controller Policy", settings.controllerPolicy); + if (settings.controllerPolicy == AnimControllerOutputPolicy.CreateOrOverride) { + settings.animControllerOutputDirectory = PathSelection("Anim Controller Directory", settings.animControllerOutputDirectory); + } + + if (EditorGUI.EndChangeCheck()) { + EditorUtility.SetDirty(settings); + } + } + + string PathSelection(string id, string path) { + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.PrefixLabel(id); + path = EditorGUILayout.TextField(path); + if (GUILayout.Button("...", GUILayout.Width(30))) { + path = GetAssetPath(EditorUtility.OpenFolderPanel("Select path", path, "")); + } + + EditorGUILayout.EndHorizontal(); + return path; + } + + static string GetAssetPath(string path) { + if (path == null) { + return null; + } + + var projectPath = Application.dataPath; + projectPath = projectPath.Substring(0, projectPath.Length - "/Assets".Length); + path = Remove(path, projectPath); + + if (path.StartsWith("\\") || path.StartsWith("/")) { + path = path.Remove(0, 1); + } + + if (!path.StartsWith("Assets") && !path.StartsWith("/Assets")) { + path = Path.Combine("Assets", path); + } + + path.Replace('\\', '/'); + + return path; + } + + static string Remove(string s, string exactExpression) { + return s.Replace(exactExpression, ""); + } + +} + } \ No newline at end of file diff --git a/Assets/Plugins/MetaSprite/Editor/Internal/ASEReimportPostprocessor.cs b/Assets/Plugins/MetaSprite/Editor/Internal/ASEReimportPostprocessor.cs index 2b0af0b..786ff83 100644 --- a/Assets/Plugins/MetaSprite/Editor/Internal/ASEReimportPostprocessor.cs +++ b/Assets/Plugins/MetaSprite/Editor/Internal/ASEReimportPostprocessor.cs @@ -48,7 +48,7 @@ private static void CompleteAutoImports() { // Legacy pipeline var asset = AssetDatabase.LoadAssetAtPath(path); var reference = ImportUtil.LoadImportSettings(asset); - if (reference && reference.settings.automaticReimport) + if (reference) { ASEImportProcess.Import(path, reference.settings); refreshed = true;