From c15093f848e9eb295502c1891389a233d9d705c5 Mon Sep 17 00:00:00 2001 From: VaDiM Date: Sat, 18 Jul 2026 01:29:08 +0300 Subject: [PATCH] Fix Live2D motion converting. Close #150 --- .../CubismMotion3Json.cs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/AssetStudioUtility/CubismLive2DExtractor/CubismMotion3Json.cs b/AssetStudioUtility/CubismLive2DExtractor/CubismMotion3Json.cs index c08af50..f55711b 100644 --- a/AssetStudioUtility/CubismLive2DExtractor/CubismMotion3Json.cs +++ b/AssetStudioUtility/CubismLive2DExtractor/CubismMotion3Json.cs @@ -101,6 +101,17 @@ namespace CubismLive2DExtractor totalSegmentCount++; } + private static void FillSingleSegment(Keyframe curve, SerializableCurve cubismCurve, float time, ref int totalPointCount, ref int totalSegmentCount) + { + var value = cubismCurve.Segments[1]; + var id = float.IsPositiveInfinity(curve.inSlope) ? 2f : 0f; + cubismCurve.Segments.Add(id); // Segment ID + cubismCurve.Segments.Add(time); + cubismCurve.Segments.Add(value); + totalPointCount++; + totalSegmentCount++; + } + public CubismMotion3Json(CubismUnityClasses.CubismFadeMotionData fadeMotion, HashSet paramNames, HashSet partNames, bool forceBezier) { Version = 3; @@ -177,6 +188,10 @@ namespace CubismLive2DExtractor fadeMotion.ParameterCurves[i].m_Curve[0].value } }; + if (fadeMotion.ParameterCurves[i].m_Curve.Count == 1) + { + FillSingleSegment(fadeMotion.ParameterCurves[i].m_Curve[0], Curves[actualCurveCount], Meta.Duration, ref totalPointCount, ref totalSegmentCount); + } for (var j = 1; j < fadeMotion.ParameterCurves[i].m_Curve.Count; j++) { var curve = fadeMotion.ParameterCurves[i].m_Curve[j]; @@ -232,6 +247,10 @@ namespace CubismLive2DExtractor track.Curve[0].value } }; + if (track.Curve.Count == 1) + { + FillSingleSegment(CreateKeyFrame(track.Curve[0]), Curves[i], Meta.Duration, ref totalPointCount, ref totalSegmentCount); + } for (var j = 1; j < track.Curve.Count; j++) { var curve = CreateKeyFrame(track.Curve[j]);