static void CreateFFDAnim(ArmatureEditor armatureEditor, AnimationClip clip , DragonBoneData.AnimSubData[] subDatas , Dictionary transformKV) { if(subDatas==null) return; for(int i=0;i vertexcurvexArray = null; List vertexcurveyArray = null; if(slotNode.childCount>0){ vertexcurvexArray = new List(); vertexcurveyArray = new List(); for(int j=0;j0) { prevTweeneasing = animSubData.frameDatas[j-1].tweenEasing; prevCurves = animSubData.frameDatas[j-1].curve; } TangentMode tanModeL = GetPrevFrameTangentMode(prevTweeneasing,prevCurves); TangentMode tanModeR = TangentMode.Linear; if(frameData.curve!=null && frameData.curve.Length>0){ tanModeR = TangentMode.Editable; isHaveCurve = true; }else{ if(frameData.tweenEasing==float.PositiveInfinity){ tanModeR = TangentMode.Stepped; } else if(frameData.tweenEasing==0){ tanModeR = TangentMode.Linear; }else if(frameData.tweenEasing==1){ tanModeR = TangentMode.Smooth; }else if(frameData.tweenEasing==2){ tanModeR = TangentMode.Linear; } } //mesh animation if(vertexcurvexArray!=null){ for(int k=0;k0) { for(int r =0;r=frameData.offset && r-frameData.offset0&& CheckCurveValid(vertex_xcurve,v.localPosition.x)) vcurveFlag = true; if(vertex_ycurve.keys !=null&& vertex_ycurve.keys.Length>0&& CheckCurveValid(vertex_ycurve,v.localPosition.y)) vcurveFlag= true; if(vcurveFlag){ if(isHaveCurve) SetCustomCurveTangents(vertex_xcurve,animSubData.frameDatas); CurveExtension.UpdateAllLinearTangents(vertex_xcurve); AnimationUtility.SetEditorCurve( clip, EditorCurveBinding.FloatCurve( ctrlPath, typeof( Transform ), "m_LocalPosition.x" ), vertex_xcurve ); if(isHaveCurve) SetCustomCurveTangents(vertex_ycurve,animSubData.frameDatas); CurveExtension.UpdateAllLinearTangents(vertex_ycurve); AnimationUtility.SetEditorCurve( clip, EditorCurveBinding.FloatCurve( ctrlPath, typeof( Transform ), "m_LocalPosition.y" ), vertex_ycurve ); } } } } } } }