diff --git a/AssetStudioUtility/CubismLive2DExtractor/CubismMotion3Converter.cs b/AssetStudioUtility/CubismLive2DExtractor/CubismMotion3Converter.cs index 34590d7..07b9092 100644 --- a/AssetStudioUtility/CubismLive2DExtractor/CubismMotion3Converter.cs +++ b/AssetStudioUtility/CubismLive2DExtractor/CubismMotion3Converter.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Text; using AssetStudio; @@ -73,7 +72,7 @@ namespace CubismLive2DExtractor if (iAnim.TrackList.Count == 0 || iAnim.Events.Count == 0) { - Logger.Warning($"[Motion Converter] {iAnim.Name} has {iAnim.TrackList.Count} tracks and {iAnim.Events.Count} event!."); + Logger.Warning($"[Motion Converter] \"{iAnim.Name}\" has {iAnim.TrackList.Count} tracks and {iAnim.Events.Count} event!."); } } } @@ -84,7 +83,7 @@ namespace CubismLive2DExtractor GetLive2dPath(binding, out var target, out var boneName); if (string.IsNullOrEmpty(boneName)) { - Logger.Warning($"[Motion Converter] {iAnim.Name} read fail on binding {Array.IndexOf(m_ClipBindingConstant.genericBindings, binding)}"); + Logger.Warning($"[Motion Converter] \"{iAnim.Name}\" read fail on binding {Array.IndexOf(m_ClipBindingConstant.genericBindings, binding)}"); return; } @@ -99,7 +98,7 @@ namespace CubismLive2DExtractor GetLive2dPath(binding, out var target, out var boneName); if (string.IsNullOrEmpty(boneName)) { - Logger.Warning($"[Motion Converter] {iAnim.Name} read fail on binding {Array.IndexOf(m_ClipBindingConstant.genericBindings, binding)}"); + Logger.Warning($"[Motion Converter] \"{iAnim.Name}\" read fail on binding {Array.IndexOf(m_ClipBindingConstant.genericBindings, binding)}"); return; } diff --git a/AssetStudioUtility/CubismLive2DExtractor/CubismMotion3Json.cs b/AssetStudioUtility/CubismLive2DExtractor/CubismMotion3Json.cs index 2d0abec..a8eab60 100644 --- a/AssetStudioUtility/CubismLive2DExtractor/CubismMotion3Json.cs +++ b/AssetStudioUtility/CubismLive2DExtractor/CubismMotion3Json.cs @@ -97,7 +97,7 @@ namespace CubismLive2DExtractor totalSegmentCount++; } - public CubismMotion3Json(CubismFadeMotion fadeMotion, bool forceBezier) + public CubismMotion3Json(CubismFadeMotion fadeMotion, HashSet paramNames, HashSet partNames, bool forceBezier) { Version = 3; Meta = new SerializableMeta @@ -130,12 +130,37 @@ namespace CubismLive2DExtractor if (fadeMotion.ParameterCurves[i].m_Curve.Length == 0) continue; + string target; + string paramId = fadeMotion.ParameterIds[i]; + switch (paramId) + { + case "Opacity": + case "EyeBlink": + case "LipSync": + target = "Model"; + break; + default: + if (paramNames.Contains(paramId)) + { + target = "Parameter"; + } + else if (partNames.Contains(paramId)) + { + target = "PartOpacity"; + } + else + { + target = paramId.ToLower().Contains("part") ? "PartOpacity" : "Parameter"; + AssetStudio.Logger.Warning($"[{fadeMotion.m_Name}] Binding error: Unable to find \"{paramId}\" among the model parts/parameters"); + } + break; + } Curves[actualCurveCount] = new SerializableCurve { // Target type. - Target = "Parameter", + Target = target, // Identifier for mapping curve to target. - Id = fadeMotion.ParameterIds[i], + Id = paramId, // [Optional] Time of the Fade - In for easing in seconds. FadeInTime = fadeMotion.ParameterFadeInTimes[i], // [Optional] Time of the Fade - Out for easing in seconds. diff --git a/AssetStudioUtility/CubismLive2DExtractor/Live2DExtractor.cs b/AssetStudioUtility/CubismLive2DExtractor/Live2DExtractor.cs index 19de546..1a374ce 100644 --- a/AssetStudioUtility/CubismLive2DExtractor/Live2DExtractor.cs +++ b/AssetStudioUtility/CubismLive2DExtractor/Live2DExtractor.cs @@ -34,6 +34,8 @@ namespace CubismLive2DExtractor var textures = new SortedSet(); var eyeBlinkParameters = new HashSet(); var lipSyncParameters = new HashSet(); + var parameterNames = new HashSet(); + var partNames = new HashSet(); MonoBehaviour physics = null; foreach (var asset in assets) @@ -69,6 +71,18 @@ namespace CubismLive2DExtractor lipSyncParameters.Add(mouthGameObject.m_Name); } break; + case "CubismParameter": + if (m_MonoBehaviour.m_GameObject.TryGet(out var paramGameObject)) + { + parameterNames.Add(paramGameObject.m_Name); + } + break; + case "CubismPart": + if (m_MonoBehaviour.m_GameObject.TryGet(out var partGameObject)) + { + partNames.Add(partGameObject.m_Name); + } + break; } } break; @@ -116,6 +130,7 @@ namespace CubismLive2DExtractor if (motionMode == Live2DMotionMode.MonoBehaviour && fadeMotionList.Count > 0) //motion from MonoBehaviour { + Logger.Debug("Motion export method: MonoBehaviour (Fade motion)"); Directory.CreateDirectory(destMotionPath); foreach (var fadeMotionMono in fadeMotionList) { @@ -134,7 +149,7 @@ namespace CubismLive2DExtractor if (fadeMotion.ParameterIds.Length == 0) continue; - var motionJson = new CubismMotion3Json(fadeMotion, forceBezier); + var motionJson = new CubismMotion3Json(fadeMotion, parameterNames, partNames, forceBezier); var animName = Path.GetFileNameWithoutExtension(fadeMotion.m_Name); if (motions.ContainsKey(animName)) @@ -151,6 +166,10 @@ namespace CubismLive2DExtractor } else if (gameObjects.Count > 0) //motion from AnimationClip { + var exportMethod = motionMode == Live2DMotionMode.AnimationClip + ? "AnimationClip" + : "AnimationClip (no Fade motions found)"; + Logger.Debug($"Motion export method: {exportMethod}"); var rootTransform = gameObjects[0].m_Transform; while (rootTransform.m_Father.TryGet(out var m_Father)) {