diff --git a/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/EditorAnimation.cs b/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/EditorAnimation.cs index 821939c3d..b17706477 100644 --- a/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/EditorAnimation.cs +++ b/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/EditorAnimation.cs @@ -1,16 +1,63 @@ +using System; +using System.IO; +using System.Linq; +using UnityEditor; +using UnityEditor.Experimental.AssetImporters; using UnityEngine; +using VRMShaders; namespace UniGLTF { public static class EditorAnimation { - public static void OnGUIAnimation(GltfParser parser) + public static void OnGUIAnimation(ScriptedImporter importer, GltfParser parser) { - for (int i = 0; i < parser.GLTF.animations.Count; ++i) + var hasExternal = importer.GetExternalObjectMap().Any(x => x.Value is AnimationClip); + using (new EditorGUI.DisabledScope(hasExternal)) { - var a = parser.GLTF.animations[i]; - GUILayout.Label($"{i}: {a.name}"); + if (GUILayout.Button("Extract Animation ...")) + { + Extract(importer, parser); + } } + + importer.DrawRemapGUI(parser.GLTF.animations.Select(x => new SubAssetKey(typeof(AnimationClip), x.name))); + + if (GUILayout.Button("Clear")) + { + importer.ClearExternalObjects( + typeof(UnityEngine.AnimationClip) + ); + } + } + + static string GetAndCreateFolder(string assetPath, string suffix) + { + var path = $"{Path.GetDirectoryName(assetPath)}/{Path.GetFileNameWithoutExtension(assetPath)}{suffix}"; + if (!Directory.Exists(path)) + { + Directory.CreateDirectory(path); + } + return path; + } + + public static void Extract(ScriptedImporter importer, GltfParser parser) + { + if (string.IsNullOrEmpty(importer.assetPath)) + { + return; + } + + + { + var path = GetAndCreateFolder(importer.assetPath, ".Animations"); + foreach (var (key, asset) in importer.GetSubAssets(importer.assetPath)) + { + asset.ExtractSubAsset($"{path}/{asset.name}.asset", false); + } + } + + AssetDatabase.ImportAsset(importer.assetPath, ImportAssetOptions.ForceUpdate); } } } diff --git a/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/EditorMaterial.cs b/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/EditorMaterial.cs index 1801dc846..60a93285d 100644 --- a/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/EditorMaterial.cs +++ b/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/EditorMaterial.cs @@ -22,7 +22,7 @@ namespace UniGLTF public static void OnGUI(ScriptedImporter importer, GltfParser parser, ITextureDescriptorGenerator textureDescriptorGenerator, Func textureDir, Func materialDir) { var hasExternal = importer.GetExternalObjectMap().Any(x => x.Value is Material || x.Value is Texture2D); - using (new EditorGUI.DisabledGroupScope(!hasExternal)) + using (new EditorGUI.DisabledScope(hasExternal)) { if (GUILayout.Button("Extract Materials And Textures ...")) { diff --git a/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/GlbScriptedImporterEditorGUI.cs b/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/GlbScriptedImporterEditorGUI.cs index d3503df95..f762ebfd3 100644 --- a/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/GlbScriptedImporterEditorGUI.cs +++ b/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/GlbScriptedImporterEditorGUI.cs @@ -45,7 +45,7 @@ namespace UniGLTF break; case Tabs.Animation: - EditorAnimation.OnGUIAnimation(m_parser); + EditorAnimation.OnGUIAnimation(m_importer, m_parser); break; case Tabs.Materials: diff --git a/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/GltfScriptedImporterEditorGUI.cs b/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/GltfScriptedImporterEditorGUI.cs index cc5a2c6fa..150d94f11 100644 --- a/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/GltfScriptedImporterEditorGUI.cs +++ b/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/GltfScriptedImporterEditorGUI.cs @@ -45,7 +45,7 @@ namespace UniGLTF break; case Tabs.Animation: - EditorAnimation.OnGUIAnimation(m_parser); + EditorAnimation.OnGUIAnimation(m_importer, m_parser); break; case Tabs.Materials: diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfParser.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfParser.cs index cc561be08..cc086a741 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfParser.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfParser.cs @@ -130,13 +130,14 @@ namespace UniGLTF RestoreOlderVersionValues(); FixMeshNameUnique(); - foreach(var image in GLTF.images) + foreach (var image in GLTF.images) { image.uri = PrepareUri(image.uri); } FixTextureNameUnique(); FixMaterialNameUnique(); FixNodeName(); + FixAnimationNameUnique(); // parepare byte buffer //GLTF.baseDir = System.IO.Path.GetDirectoryName(Path); @@ -308,6 +309,34 @@ namespace UniGLTF } } + void FixAnimationNameUnique() + { + var used = new HashSet(); + for (int i = 0; i < GLTF.animations.Count; ++i) + { + var animation = GLTF.animations[i]; + var originalName = animation.name; + int j = 2; + + if (string.IsNullOrEmpty(animation.name)) + { + animation.name = $"animation_{i}"; + } + + while (true) + { + if (used.Add(animation.name)) + { +#if VRM_DEVELOP + // Debug.Log($"Material: {material.name}"); +#endif + break; + } + animation.name = string.Format("{0}({1})", originalName, j++); + } + } + } + void RestoreOlderVersionValues() { var parsed = UniJSON.JsonParser.Parse(Json); diff --git a/Assets/VRM10/Editor/Components/VRM10ControllerEditor.cs b/Assets/VRM10/Editor/Components/VRM10ControllerEditor.cs index 739bb52c0..e696cf205 100644 --- a/Assets/VRM10/Editor/Components/VRM10ControllerEditor.cs +++ b/Assets/VRM10/Editor/Components/VRM10ControllerEditor.cs @@ -69,7 +69,7 @@ namespace UniVRM10 public override void OnInspectorGUI() { // select sub editor - using (new EditorGUI.DisabledGroupScope(false)) + using (new EditorGUI.DisabledScope(false)) { _tab = (Tabs)EditorGUILayout.EnumPopup("Select GUI", _tab); EditorGUILayout.Separator(); diff --git a/Assets/VRM10/Editor/Components/VRM10Window.cs b/Assets/VRM10/Editor/Components/VRM10Window.cs index 8c0070939..1fcb55578 100644 --- a/Assets/VRM10/Editor/Components/VRM10Window.cs +++ b/Assets/VRM10/Editor/Components/VRM10Window.cs @@ -173,7 +173,7 @@ namespace UniVRM10 } } - using (new EditorGUI.DisabledGroupScope(true)) + using (new EditorGUI.DisabledScope(true)) { if (m_constraints != null) { diff --git a/Assets/VRM10/Editor/ScriptedImporter/EditorVrm.cs b/Assets/VRM10/Editor/ScriptedImporter/EditorVrm.cs index 798665599..37e0d03f9 100644 --- a/Assets/VRM10/Editor/ScriptedImporter/EditorVrm.cs +++ b/Assets/VRM10/Editor/ScriptedImporter/EditorVrm.cs @@ -30,7 +30,7 @@ namespace UniVRM10 public static void OnGUI(ScriptedImporter importer, GltfParser parser, UniGLTF.Extensions.VRMC_vrm.VRMC_vrm vrm) { var hasExternal = importer.GetExternalObjectMap().Any(x => x.Value is VRM10MetaObject || x.Value is VRM10ExpressionAvatar || x.Value is VRM10Expression); - using (new EditorGUI.DisabledScope(!hasExternal)) + using (new EditorGUI.DisabledScope(hasExternal)) { if (GUILayout.Button("Extract Meta And Expressions ...")) {