Skip to content

Commit

Permalink
Minor code improvement & usability fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
WeAthFoLD committed Apr 27, 2021
1 parent e67bbfd commit 6778f05
Show file tree
Hide file tree
Showing 4 changed files with 162 additions and 147 deletions.
12 changes: 9 additions & 3 deletions Assets/Plugins/MetaSprite/Editor/ASEImporter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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
Expand Down Expand Up @@ -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;
}

Expand Down
28 changes: 13 additions & 15 deletions Assets/Plugins/MetaSprite/Editor/ImportMenu.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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)]
Expand Down Expand Up @@ -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.");
}
}
}

Expand All @@ -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();
}
Expand Down Expand Up @@ -154,6 +151,7 @@ void OnGUI() {
AssetDatabase.CreateAsset(instance, path);
}

AssetDatabase.Refresh();
finishedAction(settings);
this.Close();
}
Expand Down
267 changes: 139 additions & 128 deletions Assets/Plugins/MetaSprite/Editor/ImportSettings.cs
Original file line number Diff line number Diff line change
@@ -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, "");
}

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ private static void CompleteAutoImports() {
// Legacy pipeline
var asset = AssetDatabase.LoadAssetAtPath<DefaultAsset>(path);
var reference = ImportUtil.LoadImportSettings(asset);
if (reference && reference.settings.automaticReimport)
if (reference)
{
ASEImportProcess.Import(path, reference.settings);
refreshed = true;
Expand Down

0 comments on commit 6778f05

Please sign in to comment.