Exemple #1
0
 public static void addMorphAnimationCurvesToClip(AnimationCurve[] curves, string targetPath, string[] morphTargetNames, ref AnimationClip clip)
 {
     // We expect all curves to have the same length here (glTF provides a weight for all targets at each time)
     if (curves[0].keys.Length > 0)
     {
         for (int c = 0; c < curves.Length; ++c)
         {
             CurveExtension.UpdateAllLinearTangents(curves[c]);
             clip.SetCurve(targetPath, typeof(SkinnedMeshRenderer), "blendShape." + morphTargetNames[c], curves[c]);
         }
     }
 }
 static bool SetColorCurve <T>(string path, AnimationClip clip, AnimationCurve curve, string prop, bool isHaveCurve, float defaultVal, SpineData.SlotTimeline[] timelines)
 {
     if (curve.keys != null && curve.keys.Length > 0 && CheckCurveValid(curve, defaultVal))
     {
         if (isHaveCurve)
         {
             SetCustomCurveTangents(curve, timelines);
         }
         CurveExtension.UpdateAllLinearTangents(curve);
         AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(path, typeof(T), prop), curve);
         return(true);
     }
     return(false);
 }
Exemple #3
0
    public static void addScaleCurvesToClip(AnimationCurve[] scaleCurves, string targetPath, ref AnimationClip clip)
    {
        if (scaleCurves[0].keys.Length > 1)
        {
            CurveExtension.UpdateAllLinearTangents(scaleCurves[0]);
            clip.SetCurve(targetPath, typeof(Transform), "m_LocalScale.x", scaleCurves[0]);
        }

        if (scaleCurves[1].keys.Length > 1)
        {
            CurveExtension.UpdateAllLinearTangents(scaleCurves[1]);
            clip.SetCurve(targetPath, typeof(Transform), "m_LocalScale.y", scaleCurves[1]);
        }

        if (scaleCurves[2].keys.Length > 1)
        {
            CurveExtension.UpdateAllLinearTangents(scaleCurves[2]);
            clip.SetCurve(targetPath, typeof(Transform), "m_LocalScale.z", scaleCurves[2]);
        }
    }
        static void CreateAnimDeform(SpineArmatureEditor armatureEditor, AnimationClip clip, SpineData.AnimationDeformData[] animDeformDatas)
        {
            string[] skins     = armatureEditor.armature.GetComponent <Armature>().skins;
            bool     multiSkin = (skins == null || skins.Length <= 1)? false : true;

            for (int i = 0; i < animDeformDatas.Length; ++i)
            {
                SpineData.AnimationDeformData animDeformData = animDeformDatas[i];
                if (animDeformData.timelines == null || animDeformData.timelines.Length == 0)
                {
                    continue;
                }

                Dictionary <string, AnimationCurve[]> xCurveKV = new Dictionary <string, AnimationCurve[]>();             //key is attachment name
                Dictionary <string, AnimationCurve[]> yCurveKV = new Dictionary <string, AnimationCurve[]>();

                Transform slot = armatureEditor.slotsKV[animDeformData.slotName];

                bool isHaveCurve = false;
                for (int j = 0; j < animDeformData.timelines.Length; ++j)
                {
                    SpineData.DeformTimeline timeline = animDeformData.timelines[j];
                    Transform attachment      = multiSkin? slot.Find(animDeformData.skinName + "/" + timeline.attachment) : slot.Find(timeline.attachment);
                    string    prevTweeneasing = "linear";                 //前一帧的tweenEasing
                    float[]   prevCurves      = null;
                    if (j > 0)
                    {
                        prevTweeneasing = animDeformData.timelines[j - 1].tweenEasing;
                        prevCurves      = animDeformData.timelines[j - 1].curve;
                    }
                    TangentMode tanModeL = GetPrevFrameTangentMode(prevTweeneasing, prevCurves);
                    TangentMode tanModeR = TangentMode.Linear;

                    if (timeline.curve != null && timeline.curve.Length > 0)
                    {
                        tanModeR    = TangentMode.Editable;
                        isHaveCurve = true;
                    }
                    else
                    {
                        if (timeline.tweenEasing == "stepped")
                        {
                            tanModeR = TangentMode.Stepped;
                        }
                        else
                        {
                            tanModeR = TangentMode.Linear;
                        }
                    }
                    if (!xCurveKV.ContainsKey(timeline.attachment))
                    {
                        xCurveKV[timeline.attachment] = new AnimationCurve[attachment.childCount];
                        yCurveKV[timeline.attachment] = new AnimationCurve[attachment.childCount];
                    }
                    AnimationCurve[] xCurveArray = xCurveKV[timeline.attachment];
                    AnimationCurve[] yCurveArray = yCurveKV[timeline.attachment];

                    int len = attachment.childCount;
                    if (timeline.vertices != null && timeline.vertices.Length > 0)
                    {
                        for (int r = 0; r < len; ++r)
                        {
                            if (xCurveArray[r] == null)
                            {
                                xCurveArray[r] = new AnimationCurve();
                                yCurveArray[r] = new AnimationCurve();
                            }
                            AnimationCurve xCurve = xCurveArray[r];
                            AnimationCurve yCurve = yCurveArray[r];

                            Transform vCtr = attachment.GetChild(r);                            //vertex control
                            if (r >= timeline.offset && r - timeline.offset < timeline.vertices.Length)
                            {
                                Vector3 v = timeline.vertices[r - timeline.offset];
                                v += vCtr.localPosition;
                                Keyframe kfx = KeyframeUtil.GetNew(timeline.time, v.x, tanModeL, tanModeR);
                                xCurve.AddKey(kfx);
                                Keyframe kfy = KeyframeUtil.GetNew(timeline.time, v.y, tanModeL, tanModeR);
                                yCurve.AddKey(kfy);
                            }
                            else
                            {
                                Keyframe kfx = KeyframeUtil.GetNew(timeline.time, vCtr.localPosition.x, tanModeL, tanModeR);
                                xCurve.AddKey(kfx);
                                Keyframe kfy = KeyframeUtil.GetNew(timeline.time, vCtr.localPosition.y, tanModeL, tanModeR);
                                yCurve.AddKey(kfy);
                            }
                        }
                    }
                    else
                    {
                        //add default vertex position
                        for (int r = 0; r < len; ++r)
                        {
                            if (xCurveArray[r] == null)
                            {
                                xCurveArray[r] = new AnimationCurve();
                                yCurveArray[r] = new AnimationCurve();
                            }
                            AnimationCurve xCurve = xCurveArray[r];
                            AnimationCurve yCurve = yCurveArray[r];

                            Transform vCtr = attachment.GetChild(r);                            //vertex control
                            Keyframe  kfx  = KeyframeUtil.GetNew(timeline.time, vCtr.localPosition.x, tanModeL, tanModeR);
                            xCurve.AddKey(kfx);
                            Keyframe kfy = KeyframeUtil.GetNew(timeline.time, vCtr.localPosition.y, tanModeL, tanModeR);
                            yCurve.AddKey(kfy);
                        }
                    }
                }
                string path = "";
                if (slotPathKV.ContainsKey(slot.name))
                {
                    path = slotPathKV[slot.name];
                }
                else
                {
                    path = GetNodeRelativePath(armatureEditor, slot);
                    slotPathKV[slot.name] = path;
                }
                if (multiSkin)
                {
                    path += "/" + animDeformData.skinName;
                }

                foreach (string attachmentName in xCurveKV.Keys)
                {
                    AnimationCurve[] vertex_xcurves = xCurveKV[attachmentName];
                    AnimationCurve[] vertex_ycurves = yCurveKV[attachmentName];

                    Transform attachment = multiSkin? slot.Find(animDeformData.skinName + "/" + attachmentName) : slot.Find(attachmentName);
                    int       len        = attachment.childCount;
                    for (int r = 0; r < len; ++r)
                    {
                        AnimationCurve vertex_xcurve = vertex_xcurves[r];
                        AnimationCurve vertex_ycurve = vertex_ycurves[r];
                        Transform      v             = attachment.GetChild(r);
                        string         ctrlPath      = path + "/" + attachment.name + "/" + v.name;

                        CurveExtension.OptimizesCurve(vertex_xcurve);
                        CurveExtension.OptimizesCurve(vertex_ycurve);

                        bool vcurveFlag = false;
                        if (vertex_xcurve.keys != null && vertex_xcurve.keys.Length > 0 && 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, animDeformData.timelines);
                            }
                            CurveExtension.UpdateAllLinearTangents(vertex_xcurve);
                            AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(ctrlPath, typeof(Transform), "m_LocalPosition.x"), vertex_xcurve);
                            if (isHaveCurve)
                            {
                                SetCustomCurveTangents(vertex_ycurve, animDeformData.timelines);
                            }
                            CurveExtension.UpdateAllLinearTangents(vertex_ycurve);
                            AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(ctrlPath, typeof(Transform), "m_LocalPosition.y"), vertex_ycurve);

                            //add pose
                            AnimationCurve pose_vertex_xcurve = new AnimationCurve();
                            AnimationCurve pose_vertex_ycurve = new AnimationCurve();
                            pose_vertex_xcurve.AddKey(new Keyframe(0f, v.localPosition.x));
                            pose_vertex_ycurve.AddKey(new Keyframe(0f, v.localPosition.y));
                            AnimationUtility.SetEditorCurve(poseClip, EditorCurveBinding.FloatCurve(ctrlPath, typeof(Transform), "m_LocalPosition.x"), pose_vertex_xcurve);
                            AnimationUtility.SetEditorCurve(poseClip, EditorCurveBinding.FloatCurve(ctrlPath, typeof(Transform), "m_LocalPosition.y"), pose_vertex_ycurve);
                        }
                    }
                }
            }
        }
        static bool CreateAnimBone(SpineArmatureEditor armatureEditor, AnimationClip clip, SpineData.AnimationBoneData[] animBoneDatas)
        {
            Dictionary <string, string> bonePathKV = new Dictionary <string, string>();

            for (int i = 0; i < animBoneDatas.Length; ++i)
            {
                SpineData.AnimationBoneData animBoneData = animBoneDatas[i];
                Transform bone = armatureEditor.bonesKV[animBoneData.name];

                AnimationCurve xcurve      = new AnimationCurve();
                AnimationCurve ycurve      = new AnimationCurve();
                AnimationCurve sxcurve     = new AnimationCurve();
                AnimationCurve sycurve     = new AnimationCurve();
                AnimationCurve rotatecurve = new AnimationCurve();

                bool isHaveCurve = false;
                for (int j = 0; j < animBoneData.timelines.Length; ++j)
                {
                    SpineData.BoneTimeline timeline = animBoneData.timelines[j];
                    string  prevTweeneasing         = "linear";           //前一帧的tweenEasing
                    float[] prevCurves = null;
                    if (j > 0)
                    {
                        prevTweeneasing = animBoneData.timelines[j - 1].tweenEasing;
                        prevCurves      = animBoneData.timelines[j - 1].curve;
                    }
                    TangentMode tanModeL = GetPrevFrameTangentMode(prevTweeneasing, prevCurves);
                    TangentMode tanModeR = TangentMode.Linear;

                    if (timeline.curve != null && timeline.curve.Length > 0)
                    {
                        tanModeR    = TangentMode.Editable;
                        isHaveCurve = true;
                    }
                    else
                    {
                        if (timeline.tweenEasing == "stepped")
                        {
                            tanModeR = TangentMode.Stepped;
                        }
                        else
                        {
                            tanModeR = TangentMode.Linear;
                        }
                    }
                    if (timeline.type == "rotate")                 //rotate,scale,translate,shear
                    {
                        if (!float.IsNaN(timeline.angle))
                        {
                            float rotate = timeline.angle + bone.localEulerAngles.z;
                            rotatecurve.AddKey(KeyframeUtil.GetNew(timeline.time, rotate, tanModeL, tanModeR));
                        }
                    }
                    else if (timeline.type == "translate")
                    {
                        if (!float.IsNaN(timeline.x))
                        {
                            xcurve.AddKey(KeyframeUtil.GetNew(timeline.time, timeline.x + bone.localPosition.x, tanModeL, tanModeR));
                        }
                        if (!float.IsNaN(timeline.y))
                        {
                            ycurve.AddKey(KeyframeUtil.GetNew(timeline.time, timeline.y + bone.localPosition.y, tanModeL, tanModeR));
                        }
                    }
                    else if (timeline.type == "scale")
                    {
                        if (!float.IsNaN(timeline.x))
                        {
                            sxcurve.AddKey(KeyframeUtil.GetNew(timeline.time, timeline.x * bone.localScale.x, tanModeL, tanModeR));
                        }
                        if (!float.IsNaN(timeline.y))
                        {
                            sycurve.AddKey(KeyframeUtil.GetNew(timeline.time, timeline.y * bone.localScale.y, tanModeL, tanModeR));
                        }
                    }
                }
                CurveExtension.OptimizesCurve(xcurve);
                CurveExtension.OptimizesCurve(ycurve);
                CurveExtension.OptimizesCurve(sxcurve);
                CurveExtension.OptimizesCurve(sycurve);
                CurveExtension.OptimizesCurve(rotatecurve);

                string path = "";
                if (bonePathKV.ContainsKey(bone.name))
                {
                    path = bonePathKV[bone.name];
                }
                else
                {
                    path = GetNodeRelativePath(armatureEditor, bone);
                    bonePathKV[bone.name] = path;

                    if (slotPathKV.ContainsKey(bone.name) && slotPathKV[bone.name].Equals(path))
                    {
                        Debug.LogError("Bone2D Error: Name conflict ->" + path);
                        return(false);
                    }
                }

                bool localPosFlag = false;
                if (xcurve.keys != null && xcurve.keys.Length > 0 && CheckCurveValid(xcurve, bone.localPosition.x))
                {
                    localPosFlag = true;
                }
                if (ycurve.keys != null && ycurve.keys.Length > 0 && CheckCurveValid(ycurve, bone.localPosition.y))
                {
                    localPosFlag = true;
                }
                if (localPosFlag)
                {
                    if (isHaveCurve)
                    {
                        SetCustomCurveTangents(xcurve, animBoneData.timelines);
                    }
                    CurveExtension.UpdateAllLinearTangents(xcurve);
                    AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(path, typeof(Transform), "m_LocalPosition.x"), xcurve);
                    if (isHaveCurve)
                    {
                        SetCustomCurveTangents(ycurve, animBoneData.timelines);
                    }
                    CurveExtension.UpdateAllLinearTangents(ycurve);
                    AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(path, typeof(Transform), "m_LocalPosition.y"), ycurve);

                    //add pose
                    AnimationCurve posexcurve = new AnimationCurve();
                    AnimationCurve poseycurve = new AnimationCurve();
                    posexcurve.AddKey(new Keyframe(0f, bone.localPosition.x));
                    poseycurve.AddKey(new Keyframe(0f, bone.localPosition.y));
                    AnimationUtility.SetEditorCurve(poseClip, EditorCurveBinding.FloatCurve(path, typeof(Transform), "m_LocalPosition.x"), posexcurve);
                    AnimationUtility.SetEditorCurve(poseClip, EditorCurveBinding.FloatCurve(path, typeof(Transform), "m_LocalPosition.y"), poseycurve);
                }

                Bone   myBone = bone.GetComponent <Bone>();
                string scPath = path;
                if (myBone && myBone.inheritScale)
                {
                    scPath = myBone.inheritScale.name;
                }
                bool localSc = false;
                if (sxcurve.keys != null && sxcurve.keys.Length > 0 && CheckCurveValid(sxcurve, bone.localScale.x))
                {
                    localSc = true;
                }
                if (sycurve.keys != null && sycurve.keys.Length > 0 && CheckCurveValid(sycurve, bone.localScale.y))
                {
                    localSc = true;
                }
                if (localSc)
                {
                    if (isHaveCurve)
                    {
                        SetCustomCurveTangents(sxcurve, animBoneData.timelines);
                    }
                    CurveExtension.UpdateAllLinearTangents(sxcurve);
                    AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(scPath, typeof(Transform), "m_LocalScale.x"), sxcurve);
                    if (isHaveCurve)
                    {
                        SetCustomCurveTangents(sycurve, animBoneData.timelines);
                    }
                    CurveExtension.UpdateAllLinearTangents(sycurve);
                    AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(scPath, typeof(Transform), "m_LocalScale.y"), sycurve);

                    //add pose
                    AnimationCurve posesxcurve = new AnimationCurve();
                    AnimationCurve posesycurve = new AnimationCurve();
                    posesxcurve.AddKey(new Keyframe(0f, bone.localScale.x));
                    posesycurve.AddKey(new Keyframe(0f, bone.localScale.y));
                    AnimationUtility.SetEditorCurve(poseClip, EditorCurveBinding.FloatCurve(path, typeof(Transform), "m_LocalScale.x"), posesxcurve);
                    AnimationUtility.SetEditorCurve(poseClip, EditorCurveBinding.FloatCurve(path, typeof(Transform), "m_LocalScale.y"), posesycurve);
                }

                string rotatePath = path;
                if (myBone && myBone.inheritRotation)
                {
                    rotatePath = myBone.inheritRotation.name;
                }
                if (rotatecurve.keys != null && rotatecurve.keys.Length > 0 && CheckCurveValid(rotatecurve, bone.localEulerAngles.z))
                {
                    CurveExtension.ClampCurveRotate360(rotatecurve, false);
                    if (isHaveCurve)
                    {
                        SetCustomCurveTangents(rotatecurve, animBoneData.timelines);
                    }
                    CurveExtension.UpdateAllLinearTangents(rotatecurve);
                    clip.SetCurve(rotatePath, typeof(Transform), "localEulerAngles.z", rotatecurve);

                    //add pose
                    AnimationCurve posesrotatecurve = new AnimationCurve();
                    posesrotatecurve.AddKey(new Keyframe(0f, bone.localEulerAngles.z));
                    AnimationUtility.SetEditorCurve(poseClip, EditorCurveBinding.FloatCurve(path, typeof(Transform), "localEulerAngles.z"), posesrotatecurve);
                }
            }
            return(true);
        }
        static void CreateBoneAnim(ArmatureEditor armatureEditor, AnimationClip clip, DragonBoneData.AnimSubData[] subDatas, Dictionary <string, Transform> transformKV)
        {
            if (subDatas == null)
            {
                return;
            }
            Dictionary <string, string> bonePathKV = new Dictionary <string, string>();

            for (int i = 0; i < subDatas.Length; ++i)
            {
                DragonBoneData.AnimSubData animSubData = subDatas[i];
                string    boneName = animSubData.name;
                Transform boneNode = transformKV[boneName];
                DragonBoneData.TransformData defaultTransformData = armatureEditor.bonesDataKV[animSubData.name].transform;

                AnimationCurve xcurve      = new AnimationCurve();
                AnimationCurve ycurve      = new AnimationCurve();
                AnimationCurve sxcurve     = new AnimationCurve();
                AnimationCurve sycurve     = new AnimationCurve();
                AnimationCurve rotatecurve = new AnimationCurve();

                float during      = animSubData.offset;
                float perKeyTime  = 1f / armatureEditor.armatureData.frameRate;
                bool  isHaveCurve = false;
                for (int j = 0; j < animSubData.frameDatas.Length; ++j)
                {
                    DragonBoneData.AnimFrameData frameData = animSubData.frameDatas[j];

                    float   prevTweeneasing = float.PositiveInfinity;                  //前一帧的tweenEasing
                    float[] prevCurves      = null;
                    if (j > 0)
                    {
                        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;
                        }
                    }
                    if (frameData.transformData != null)
                    {
                        if (!float.IsNaN(frameData.transformData.x))
                        {
                            if (!float.IsNaN(defaultTransformData.x))
                            {
                                xcurve.AddKey(KeyframeUtil.GetNew(during, frameData.transformData.x + defaultTransformData.x, tanModeL, tanModeR));
                            }
                            else
                            {
                                xcurve.AddKey(KeyframeUtil.GetNew(during, frameData.transformData.x, tanModeL, tanModeR));
                            }
                        }
                        else if (!float.IsNaN(defaultTransformData.x))
                        {
                            xcurve.AddKey(KeyframeUtil.GetNew(during, defaultTransformData.x, tanModeL, tanModeR));
                        }

                        if (!float.IsNaN(frameData.transformData.y))
                        {
                            if (!float.IsNaN(defaultTransformData.y))
                            {
                                ycurve.AddKey(KeyframeUtil.GetNew(during, frameData.transformData.y + defaultTransformData.y, tanModeL, tanModeR));
                            }
                            else
                            {
                                ycurve.AddKey(KeyframeUtil.GetNew(during, frameData.transformData.y, tanModeL, tanModeR));
                            }
                        }
                        else if (!float.IsNaN(defaultTransformData.y))
                        {
                            ycurve.AddKey(KeyframeUtil.GetNew(during, defaultTransformData.y, tanModeL, tanModeR));
                        }

                        if (!float.IsNaN(frameData.transformData.rotate))
                        {
                            float rotate = frameData.transformData.rotate + defaultTransformData.rotate;
                            rotatecurve.AddKey(KeyframeUtil.GetNew(during, rotate, tanModeL, tanModeR));
                        }
                        else if (!float.IsNaN(defaultTransformData.rotate))
                        {
                            rotatecurve.AddKey(KeyframeUtil.GetNew(during, boneNode.localEulerAngles.z, tanModeL, tanModeR));
                        }

                        if (!float.IsNaN(frameData.transformData.scx))
                        {
                            sxcurve.AddKey(KeyframeUtil.GetNew(during, frameData.transformData.scx * defaultTransformData.scx, tanModeL, tanModeR));
                        }
                        else
                        {
                            sxcurve.AddKey(KeyframeUtil.GetNew(during, boneNode.localScale.x, tanModeL, tanModeR));
                        }

                        if (!float.IsNaN(frameData.transformData.scy))
                        {
                            sycurve.AddKey(KeyframeUtil.GetNew(during, frameData.transformData.scy * defaultTransformData.scy, tanModeL, tanModeR));
                        }
                        else
                        {
                            sycurve.AddKey(KeyframeUtil.GetNew(during, boneNode.localScale.y, tanModeL, tanModeR));
                        }
                    }
                    during += frameData.duration * perKeyTime;
                }

                CurveExtension.OptimizesCurve(xcurve);
                CurveExtension.OptimizesCurve(ycurve);
                CurveExtension.OptimizesCurve(sxcurve);
                CurveExtension.OptimizesCurve(sycurve);
                CurveExtension.OptimizesCurve(rotatecurve);

                string path = "";
                if (bonePathKV.ContainsKey(boneName))
                {
                    path = bonePathKV[boneName];
                }
                else
                {
                    path = GetNodeRelativePath(armatureEditor, boneNode);
                    bonePathKV[boneName] = path;
                }
                bool localPosFlag = false;
                if (xcurve.keys != null && xcurve.keys.Length > 0 && CheckCurveValid(xcurve, boneNode.localPosition.x))
                {
                    localPosFlag = true;
                }
                if (ycurve.keys != null && ycurve.keys.Length > 0 && CheckCurveValid(ycurve, boneNode.localPosition.y))
                {
                    localPosFlag = true;
                }
                if (localPosFlag)
                {
                    if (isHaveCurve)
                    {
                        SetCustomCurveTangents(xcurve, animSubData.frameDatas);
                    }
                    CurveExtension.UpdateAllLinearTangents(xcurve);
                    AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(path, typeof(Transform), "m_LocalPosition.x"), xcurve);
                    if (isHaveCurve)
                    {
                        SetCustomCurveTangents(ycurve, animSubData.frameDatas);
                    }
                    CurveExtension.UpdateAllLinearTangents(ycurve);
                    AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(path, typeof(Transform), "m_LocalPosition.y"), ycurve);
                }

                bool localSc = false;
                if (sxcurve.keys != null && sxcurve.keys.Length > 0 && CheckCurveValid(sxcurve, defaultTransformData.scx))
                {
                    localSc = true;
                }
                if (sycurve.keys != null && sycurve.keys.Length > 0 && CheckCurveValid(sycurve, defaultTransformData.scy))
                {
                    localSc = true;
                }
                if (localSc)
                {
                    if (isHaveCurve)
                    {
                        SetCustomCurveTangents(sxcurve, animSubData.frameDatas);
                    }
                    CurveExtension.UpdateAllLinearTangents(sxcurve);
                    AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(path, typeof(Transform), "m_LocalScale.x"), sxcurve);
                    if (isHaveCurve)
                    {
                        SetCustomCurveTangents(sycurve, animSubData.frameDatas);
                    }
                    CurveExtension.UpdateAllLinearTangents(sycurve);
                    AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(path, typeof(Transform), "m_LocalScale.y"), sycurve);
                }

                if (rotatecurve.keys != null && rotatecurve.keys.Length > 0 && CheckCurveValid(rotatecurve, defaultTransformData.rotate))
                {
                    CurveExtension.ClampCurveRotate360(rotatecurve);
                    if (isHaveCurve)
                    {
                        SetCustomCurveTangents(rotatecurve, animSubData.frameDatas);
                    }
                    CurveExtension.UpdateAllLinearTangents(rotatecurve);
                    clip.SetCurve(path, typeof(Transform), "localEulerAngles.z", rotatecurve);
                }
            }
        }
        static void CreateFFDAnim(ArmatureEditor armatureEditor, AnimationClip clip, DragonBoneData.AnimSubData[] subDatas, Dictionary <string, Transform> transformKV)
        {
            if (subDatas == null)
            {
                return;
            }
            for (int i = 0; i < subDatas.Length; ++i)
            {
                DragonBoneData.AnimSubData animSubData = subDatas[i];
                string    slotName = string.IsNullOrEmpty(animSubData.slot) ? animSubData.name : animSubData.slot;
                Transform slotNode = transformKV[slotName];

                List <AnimationCurve[]> vertexcurvexArray = null;
                List <AnimationCurve[]> vertexcurveyArray = null;
                if (slotNode.childCount > 0)
                {
                    vertexcurvexArray = new List <AnimationCurve[]>();
                    vertexcurveyArray = new List <AnimationCurve[]>();
                    for (int j = 0; j < slotNode.childCount; ++j)
                    {
                        Transform ffdNode = slotNode.GetChild(j);
                        if (ffdNode.name == animSubData.name)
                        {
                            AnimationCurve[] vertex_xcurves = new AnimationCurve[ffdNode.childCount];
                            AnimationCurve[] vertex_ycurves = new AnimationCurve[ffdNode.childCount];
                            for (int r = 0; r < vertex_xcurves.Length; ++r)
                            {
                                vertex_xcurves[r] = new AnimationCurve();
                                vertex_ycurves[r] = new AnimationCurve();
                            }
                            vertexcurvexArray.Add(vertex_xcurves);
                            vertexcurveyArray.Add(vertex_ycurves);
                        }
                    }
                }

                float during      = animSubData.offset;
                float perKeyTime  = 1f / armatureEditor.armatureData.frameRate;
                bool  isHaveCurve = false;
                for (int j = 0; j < animSubData.frameDatas.Length; ++j)
                {
                    DragonBoneData.AnimFrameData frameData = animSubData.frameDatas[j];

                    float   prevTweeneasing = float.PositiveInfinity;                  //前一帧的tweenEasing
                    float[] prevCurves      = null;
                    if (j > 0)
                    {
                        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; k < vertexcurvexArray.Count; ++k)
                        {
                            Transform ffdNode = slotNode.GetChild(k);
                            if (ffdNode.name == animSubData.name)
                            {
                                AnimationCurve[] vertex_xcurves = vertexcurvexArray[k];
                                AnimationCurve[] vertex_ycurves = vertexcurveyArray[k];
                                int len = ffdNode.childCount;
                                if (frameData.vertices != null && frameData.vertices.Length > 0)
                                {
                                    for (int r = 0; r < len; ++r)
                                    {
                                        AnimationCurve vertex_xcurve = vertex_xcurves[r];
                                        AnimationCurve vertex_ycurve = vertex_ycurves[r];
                                        Transform      vCtr          = ffdNode.GetChild(r);                          //顶点控制点
                                        if (r >= frameData.offset && r - frameData.offset < frameData.vertices.Length)
                                        {
                                            Keyframe kfx = KeyframeUtil.GetNew(during, vCtr.localPosition.x + frameData.vertices[r - frameData.offset].x, tanModeL, tanModeR);
                                            vertex_xcurve.AddKey(kfx);
                                            Keyframe kfy = KeyframeUtil.GetNew(during, vCtr.localPosition.y + frameData.vertices[r - frameData.offset].y, tanModeL, tanModeR);
                                            vertex_ycurve.AddKey(kfy);
                                        }
                                        else
                                        {
                                            Keyframe kfx = KeyframeUtil.GetNew(during, vCtr.localPosition.x, tanModeL, tanModeR);
                                            vertex_xcurve.AddKey(kfx);
                                            Keyframe kfy = KeyframeUtil.GetNew(during, vCtr.localPosition.y, tanModeL, tanModeR);
                                            vertex_ycurve.AddKey(kfy);
                                        }
                                    }
                                }
                                else
                                {
                                    //add default vertex position
                                    for (int r = 0; r < len; ++r)
                                    {
                                        AnimationCurve vertex_xcurve = vertex_xcurves[r];
                                        AnimationCurve vertex_ycurve = vertex_ycurves[r];
                                        Transform      vCtr          = slotNode.GetChild(k).GetChild(r);                          //顶点控制点
                                        Keyframe       kfx           = KeyframeUtil.GetNew(during, vCtr.localPosition.x, tanModeL, tanModeR);
                                        vertex_xcurve.AddKey(kfx);
                                        Keyframe kfy = KeyframeUtil.GetNew(during, vCtr.localPosition.y, tanModeL, tanModeR);
                                        vertex_ycurve.AddKey(kfy);
                                    }
                                }
                            }
                        }
                    }

                    during += frameData.duration * perKeyTime;
                }

                string path = "";
                if (slotPathKV.ContainsKey(slotName))
                {
                    path = slotPathKV[slotName];
                }
                else
                {
                    path = GetNodeRelativePath(armatureEditor, slotNode);
                    slotPathKV[slotName] = path;
                }

                if (vertexcurvexArray != null)
                {
                    for (int k = 0; k < vertexcurvexArray.Count; ++k)
                    {
                        Transform ffdNode = slotNode.GetChild(k);
                        if (ffdNode.name == animSubData.name)
                        {
                            changedSpriteMeshsKV[path + "/" + ffdNode.name] = ffdNode.GetComponent <SpriteMesh>();

                            AnimationCurve[] vertex_xcurves = vertexcurvexArray[k];
                            AnimationCurve[] vertex_ycurves = vertexcurveyArray[k];
                            for (int r = 0; r < vertex_xcurves.Length; ++r)
                            {
                                AnimationCurve vertex_xcurve = vertex_xcurves[r];
                                AnimationCurve vertex_ycurve = vertex_ycurves[r];
                                Transform      v             = ffdNode.GetChild(r);
                                string         ctrlPath      = path + "/" + ffdNode.name + "/" + v.name;

                                CurveExtension.OptimizesCurve(vertex_xcurve);
                                CurveExtension.OptimizesCurve(vertex_ycurve);

                                bool vcurveFlag = false;
                                if (vertex_xcurve.keys != null && vertex_xcurve.keys.Length > 0 && 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);
                                }
                            }
                        }
                    }
                }
            }
        }
Exemple #8
0
        static void CreateAnimBoneAndSlot(ArmatureEditor armatureEditor, AnimationClip clip, DragonBoneData.AnimSubData[] subDatas, Dictionary <string, Transform> transformKV, bool boneOrSlot, bool isffd = false)
        {
            for (int i = 0; i < subDatas.Length; ++i)
            {
                DragonBoneData.AnimSubData animSubData = subDatas[i];
                string    name = string.IsNullOrEmpty(animSubData.slot) ? animSubData.name : animSubData.slot;
                Transform node = transformKV[name];
                DragonBoneData.TransformData defaultTransformData = boneOrSlot ? armatureEditor.bonesDataKV[animSubData.name].transform:null;
                float defaultZ = boneOrSlot ? 0: armatureEditor.slotsDataKV[name].z;;
                DragonBoneData.SlotData  defaultSlotData  = boneOrSlot ? null:armatureEditor.slotsDataKV[name];
                DragonBoneData.ColorData defaultColorData = boneOrSlot ? null: defaultSlotData.color;
                AnimationCurve           xcurve           = new AnimationCurve();
                AnimationCurve           ycurve           = new AnimationCurve();
                AnimationCurve           zcurve           = new AnimationCurve();
                AnimationCurve           sxcurve          = new AnimationCurve();
                AnimationCurve           sycurve          = new AnimationCurve();
                AnimationCurve           color_rcurve     = new AnimationCurve();
                AnimationCurve           color_gcurve     = new AnimationCurve();
                AnimationCurve           color_bcurve     = new AnimationCurve();
                AnimationCurve           color_acurve     = new AnimationCurve();
                AnimationCurve           rotatecurve      = new AnimationCurve();

                Renderer[]       renders      = node.GetComponentsInChildren <Renderer>();
                AnimationCurve[] renderCurves = new AnimationCurve[renders.Length];
                for (int r = 0; r < renderCurves.Length; ++r)
                {
                    renderCurves[r] = new AnimationCurve();
                }

                List <AnimationCurve[]> vertexcurvexArray = null;
                List <AnimationCurve[]> vertexcurveyArray = null;
                if (isffd && node.childCount > 0)
                {
                    vertexcurvexArray = new List <AnimationCurve[]>();
                    vertexcurveyArray = new List <AnimationCurve[]>();

                    for (int j = 0; j < node.childCount; ++j)
                    {
                        Transform ffdNode = node.GetChild(j);
                        if (ffdNode.name == animSubData.name)
                        {
                            AnimationCurve[] vertex_xcurves = new AnimationCurve[ffdNode.childCount];
                            AnimationCurve[] vertex_ycurves = new AnimationCurve[ffdNode.childCount];
                            for (int r = 0; r < vertex_xcurves.Length; ++r)
                            {
                                vertex_xcurves[r] = new AnimationCurve();
                                vertex_ycurves[r] = new AnimationCurve();
                            }
                            vertexcurvexArray.Add(vertex_xcurves);
                            vertexcurveyArray.Add(vertex_ycurves);
                        }
                    }
                }

                float during      = animSubData.offset;
                float perKeyTime  = 1f / armatureEditor.armatureData.frameRate;
                bool  isHaveCurve = false;
                for (int j = 0; j < animSubData.frameDatas.Length; ++j)
                {
                    DragonBoneData.AnimFrameData frameData = animSubData.frameDatas[j];

                    float   prevTweeneasing = float.PositiveInfinity;                  //前一帧的tweenEasing
                    float[] prevCurves      = null;
                    if (j > 0)
                    {
                        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;
                        }
                    }
                    if (frameData.transformData != null)
                    {
                        if (!float.IsNaN(frameData.transformData.x))
                        {
                            if (!float.IsNaN(defaultTransformData.x))
                            {
                                xcurve.AddKey(KeyframeUtil.GetNew(during, frameData.transformData.x + defaultTransformData.x, tanModeL, tanModeR));
                            }
                            else
                            {
                                xcurve.AddKey(KeyframeUtil.GetNew(during, frameData.transformData.x, tanModeL, tanModeR));
                            }
                        }
                        else if (!float.IsNaN(defaultTransformData.x))
                        {
                            xcurve.AddKey(KeyframeUtil.GetNew(during, defaultTransformData.x, tanModeL, tanModeR));
                        }

                        if (!float.IsNaN(frameData.transformData.y))
                        {
                            if (!float.IsNaN(defaultTransformData.y))
                            {
                                ycurve.AddKey(KeyframeUtil.GetNew(during, frameData.transformData.y + defaultTransformData.y, tanModeL, tanModeR));
                            }
                            else
                            {
                                ycurve.AddKey(KeyframeUtil.GetNew(during, frameData.transformData.y, tanModeL, tanModeR));
                            }
                        }
                        else if (!float.IsNaN(defaultTransformData.y))
                        {
                            ycurve.AddKey(KeyframeUtil.GetNew(during, defaultTransformData.y, tanModeL, tanModeR));
                        }

                        if (!float.IsNaN(frameData.z))
                        {
                            zcurve.AddKey(new Keyframe(during, frameData.z, float.PositiveInfinity, float.PositiveInfinity));
                        }
                        else if (!boneOrSlot)
                        {
                            zcurve.AddKey(new Keyframe(during, node.localPosition.z, float.PositiveInfinity, float.PositiveInfinity));
                        }

                        if (!float.IsNaN(frameData.transformData.rotate))
                        {
                            float rotate = frameData.transformData.rotate + defaultTransformData.rotate;
                            rotatecurve.AddKey(KeyframeUtil.GetNew(during, rotate, tanModeL, tanModeR));
                        }
                        else if (!float.IsNaN(defaultTransformData.rotate))
                        {
                            rotatecurve.AddKey(KeyframeUtil.GetNew(during, node.localEulerAngles.z, tanModeL, tanModeR));
                        }

                        if (!float.IsNaN(frameData.transformData.scx))
                        {
                            sxcurve.AddKey(KeyframeUtil.GetNew(during, frameData.transformData.scx * defaultTransformData.scx, tanModeL, tanModeR));
                        }
                        else
                        {
                            sxcurve.AddKey(KeyframeUtil.GetNew(during, node.localScale.x, tanModeL, tanModeR));
                        }

                        if (!float.IsNaN(frameData.transformData.scy))
                        {
                            sycurve.AddKey(KeyframeUtil.GetNew(during, frameData.transformData.scy * defaultTransformData.scy, tanModeL, tanModeR));
                        }
                        else
                        {
                            sycurve.AddKey(KeyframeUtil.GetNew(during, node.localScale.y, tanModeL, tanModeR));
                        }
                    }
                    if (!boneOrSlot)
                    {
                        if (frameData.color != null)
                        {
                            if (defaultColorData == null)
                            {
                                defaultColorData = new DragonBoneData.ColorData();
                            }
                            Color c = new Color(
                                frameData.color.rM + frameData.color.r0,
                                frameData.color.gM + frameData.color.g0,
                                frameData.color.bM + frameData.color.b0,
                                frameData.color.aM + frameData.color.a0
                                );
                            color_rcurve.AddKey(KeyframeUtil.GetNew(during, c.r, tanModeL, tanModeR));
                            color_gcurve.AddKey(KeyframeUtil.GetNew(during, c.g, tanModeL, tanModeR));
                            color_bcurve.AddKey(KeyframeUtil.GetNew(during, c.b, tanModeL, tanModeR));
                            color_acurve.AddKey(KeyframeUtil.GetNew(during, c.a, tanModeL, tanModeR));
                        }

                        if (!isffd)
                        {
                            //改displyindex
                            if (frameData.displayIndex == -1)
                            {
                                for (int r = 0; r < renders.Length; ++r)
                                {
                                    renderCurves[r].AddKey(new Keyframe(during, 0f, float.PositiveInfinity, float.PositiveInfinity));
                                }
                            }
                            else
                            {
                                for (int r = 0; r < renders.Length; ++r)
                                {
                                    if (r != frameData.displayIndex)
                                    {
                                        renderCurves[r].AddKey(new Keyframe(during, 0f, float.PositiveInfinity, float.PositiveInfinity));
                                    }
                                    else
                                    {
                                        renderCurves[r].AddKey(new Keyframe(during, 1f, float.PositiveInfinity, float.PositiveInfinity));
                                    }
                                }
                            }
                        }
                    }


                    //mesh animation
                    if (isffd && vertexcurvexArray != null)
                    {
                        for (int k = 0; k < vertexcurvexArray.Count; ++k)
                        {
                            Transform ffdNode = node.GetChild(k);
                            if (ffdNode.name == animSubData.name)
                            {
                                AnimationCurve[] vertex_xcurves = vertexcurvexArray[k];
                                AnimationCurve[] vertex_ycurves = vertexcurveyArray[k];
                                int len = ffdNode.childCount;
                                if (frameData.vertices != null && frameData.vertices.Length > 0)
                                {
                                    for (int r = 0; r < len; ++r)
                                    {
                                        AnimationCurve vertex_xcurve = vertex_xcurves[r];
                                        AnimationCurve vertex_ycurve = vertex_ycurves[r];
                                        Transform      vCtr          = ffdNode.GetChild(r);                          //顶点控制点
                                        if (r >= frameData.offset && r - frameData.offset < frameData.vertices.Length)
                                        {
                                            Keyframe kfx = KeyframeUtil.GetNew(during, vCtr.localPosition.x + frameData.vertices[r - frameData.offset].x, tanModeL, tanModeR);
                                            vertex_xcurve.AddKey(kfx);
                                            Keyframe kfy = KeyframeUtil.GetNew(during, vCtr.localPosition.y + frameData.vertices[r - frameData.offset].y, tanModeL, tanModeR);
                                            vertex_ycurve.AddKey(kfy);
                                        }
                                        else
                                        {
                                            Keyframe kfx = KeyframeUtil.GetNew(during, vCtr.localPosition.x, tanModeL, tanModeR);
                                            vertex_xcurve.AddKey(kfx);
                                            Keyframe kfy = KeyframeUtil.GetNew(during, vCtr.localPosition.y, tanModeL, tanModeR);
                                            vertex_ycurve.AddKey(kfy);
                                        }
                                    }
                                }
                                else
                                {
                                    //add default vertex position
                                    for (int r = 0; r < len; ++r)
                                    {
                                        AnimationCurve vertex_xcurve = vertex_xcurves[r];
                                        AnimationCurve vertex_ycurve = vertex_ycurves[r];
                                        Transform      vCtr          = node.GetChild(k).GetChild(r);                          //顶点控制点
                                        Keyframe       kfx           = KeyframeUtil.GetNew(during, vCtr.localPosition.x, tanModeL, tanModeR);
                                        vertex_xcurve.AddKey(kfx);
                                        Keyframe kfy = KeyframeUtil.GetNew(during, vCtr.localPosition.y, tanModeL, tanModeR);
                                        vertex_ycurve.AddKey(kfy);
                                    }
                                }
                            }
                        }
                    }

                    during += frameData.duration * perKeyTime;
                }

                CurveExtension.OptimizesCurve(xcurve);
                CurveExtension.OptimizesCurve(ycurve);
                CurveExtension.OptimizesCurve(zcurve);
                CurveExtension.OptimizesCurve(sxcurve);
                CurveExtension.OptimizesCurve(sycurve);
                CurveExtension.OptimizesCurve(color_rcurve);
                CurveExtension.OptimizesCurve(color_gcurve);
                CurveExtension.OptimizesCurve(color_bcurve);
                CurveExtension.OptimizesCurve(color_acurve);
                CurveExtension.OptimizesCurve(rotatecurve);


                string path         = GetNodeRelativePath(armatureEditor, node);
                bool   localPosFlag = false;
                if (xcurve.keys != null && xcurve.keys.Length > 0 && CheckCurveValid(xcurve, node.localPosition.x))
                {
                    localPosFlag = true;
                }
                if (ycurve.keys != null && ycurve.keys.Length > 0 && CheckCurveValid(ycurve, node.localPosition.y))
                {
                    localPosFlag = true;
                }
                if (zcurve.keys != null && zcurve.keys.Length > 0 && CheckCurveValid(zcurve, defaultZ))
                {
                    localPosFlag = true;
                }
                if (localPosFlag)
                {
                    if (isHaveCurve)
                    {
                        SetCustomCurveTangents(xcurve, animSubData.frameDatas);
                    }
                    CurveExtension.UpdateAllLinearTangents(xcurve);
                    AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(path, typeof(Transform), "m_LocalPosition.x"), xcurve);
                    if (isHaveCurve)
                    {
                        SetCustomCurveTangents(ycurve, animSubData.frameDatas);
                    }
                    CurveExtension.UpdateAllLinearTangents(ycurve);
                    AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(path, typeof(Transform), "m_LocalPosition.y"), ycurve);
                }

                bool localSc = false;
                if (sxcurve.keys != null && sxcurve.keys.Length > 0 && CheckCurveValid(sxcurve, defaultTransformData.scx))
                {
                    localSc = true;
                }
                if (sycurve.keys != null && sycurve.keys.Length > 0 && CheckCurveValid(sycurve, defaultTransformData.scy))
                {
                    localSc = true;
                }
                if (localSc)
                {
                    if (isHaveCurve)
                    {
                        SetCustomCurveTangents(sxcurve, animSubData.frameDatas);
                    }
                    CurveExtension.UpdateAllLinearTangents(sxcurve);
                    AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(path, typeof(Transform), "m_LocalScale.x"), sxcurve);
                    if (isHaveCurve)
                    {
                        SetCustomCurveTangents(sycurve, animSubData.frameDatas);
                    }
                    CurveExtension.UpdateAllLinearTangents(sycurve);
                    AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(path, typeof(Transform), "m_LocalScale.y"), sycurve);
                }

                if (rotatecurve.keys != null && rotatecurve.keys.Length > 0 && CheckCurveValid(rotatecurve, defaultTransformData.rotate))
                {
                    CurveExtension.ClampCurveRotate360(rotatecurve);
                    if (isHaveCurve)
                    {
                        SetCustomCurveTangents(rotatecurve, animSubData.frameDatas);
                    }
                    CurveExtension.UpdateAllLinearTangents(rotatecurve);
                    clip.SetCurve(path, typeof(Transform), "localEulerAngles.z", rotatecurve);
                }

                if (!boneOrSlot)
                {
                    if (defaultColorData == null)
                    {
                        defaultColorData = new DragonBoneData.ColorData();
                    }

                    float da = defaultColorData.aM + defaultColorData.a0;
                    float dr = defaultColorData.rM + defaultColorData.r0;
                    float dg = defaultColorData.gM + defaultColorData.g0;
                    float db = defaultColorData.bM + defaultColorData.b0;
                    if (armatureEditor.useUnitySprite)
                    {
                        SpriteRenderer[] sprites = node.GetComponentsInChildren <SpriteRenderer>();
                        if (sprites != null)
                        {
                            for (int z = 0; z < sprites.Length; ++z)
                            {
                                string childPath = path + "/" + sprites[z].name;
                                SetColorCurve <SpriteRenderer>(childPath, clip, color_rcurve, "m_Color.r", isHaveCurve, dr, animSubData.frameDatas);
                                SetColorCurve <SpriteRenderer>(childPath, clip, color_gcurve, "m_Color.g", isHaveCurve, dg, animSubData.frameDatas);
                                SetColorCurve <SpriteRenderer>(childPath, clip, color_bcurve, "m_Color.b", isHaveCurve, db, animSubData.frameDatas);
                                SetColorCurve <SpriteRenderer>(childPath, clip, color_acurve, "m_Color.a", isHaveCurve, da, animSubData.frameDatas);
                            }
                        }
                    }
                    else
                    {
                        SpriteFrame[] sprites = node.GetComponentsInChildren <SpriteFrame>();
                        if (sprites != null)
                        {
                            for (int z = 0; z < sprites.Length; ++z)
                            {
                                string childPath = path + "/" + sprites[z].name;
                                bool   anim_r    = SetColorCurve <SpriteFrame>(childPath, clip, color_rcurve, "m_color.r", isHaveCurve, dr, animSubData.frameDatas);
                                bool   anim_g    = SetColorCurve <SpriteFrame>(childPath, clip, color_gcurve, "m_color.g", isHaveCurve, dg, animSubData.frameDatas);
                                bool   anim_b    = SetColorCurve <SpriteFrame>(childPath, clip, color_bcurve, "m_color.b", isHaveCurve, db, animSubData.frameDatas);
                                bool   anim_a    = SetColorCurve <SpriteFrame>(childPath, clip, color_acurve, "m_color.a", isHaveCurve, da, animSubData.frameDatas);
                                if (anim_r || anim_g || anim_b || anim_a)
                                {
                                    changedSpriteFramesKV[childPath] = sprites[z];
                                }
                            }
                        }

                        SpriteMesh[] spriteMeshs = node.GetComponentsInChildren <SpriteMesh>();
                        if (spriteMeshs != null)
                        {
                            for (int z = 0; z < spriteMeshs.Length; ++z)
                            {
                                string childPath = path + "/" + spriteMeshs[z].name;
                                bool   anim_r    = SetColorCurve <SpriteMesh>(childPath, clip, color_rcurve, "m_color.r", isHaveCurve, da, animSubData.frameDatas);
                                bool   anim_g    = SetColorCurve <SpriteMesh>(childPath, clip, color_gcurve, "m_color.g", isHaveCurve, dg, animSubData.frameDatas);
                                bool   anim_b    = SetColorCurve <SpriteMesh>(childPath, clip, color_bcurve, "m_color.b", isHaveCurve, db, animSubData.frameDatas);
                                bool   anim_a    = SetColorCurve <SpriteMesh>(childPath, clip, color_acurve, "m_color.a", isHaveCurve, da, animSubData.frameDatas);
                                if (anim_r || anim_g || anim_b || anim_a)
                                {
                                    changedSpriteMeshsKV[childPath] = spriteMeshs[z];
                                }
                            }
                        }
                    }

                    for (int r = 0; r < renderCurves.Length; ++r)
                    {
                        AnimationCurve ac           = renderCurves[r];
                        Renderer       render       = renders[r];
                        float          defaultValue = render.enabled? 1: 0;
                        if (ac.keys != null && ac.keys.Length > 0 && CheckCurveValid(ac, defaultValue))
                        {
                            clip.SetCurve(path + "/" + render.name, typeof(GameObject), "m_IsActive", ac);                      //m_Enabled
                        }
                    }

                    if (isffd && vertexcurvexArray != null)
                    {
                        for (int k = 0; k < vertexcurvexArray.Count; ++k)
                        {
                            Transform ffdNode = node.GetChild(k);
                            if (ffdNode.name == animSubData.name)
                            {
                                changedSpriteMeshsKV[path + "/" + ffdNode.name] = ffdNode.GetComponent <SpriteMesh>();

                                AnimationCurve[] vertex_xcurves = vertexcurvexArray[k];
                                AnimationCurve[] vertex_ycurves = vertexcurveyArray[k];
                                for (int r = 0; r < vertex_xcurves.Length; ++r)
                                {
                                    AnimationCurve vertex_xcurve = vertex_xcurves[r];
                                    AnimationCurve vertex_ycurve = vertex_ycurves[r];
                                    Transform      v             = ffdNode.GetChild(r);
                                    string         ctrlPath      = path + "/" + ffdNode.name + "/" + v.name;

                                    CurveExtension.OptimizesCurve(vertex_xcurve);
                                    CurveExtension.OptimizesCurve(vertex_ycurve);

                                    bool vcurveFlag = false;
                                    if (vertex_xcurve.keys != null && vertex_xcurve.keys.Length > 0 && 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);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }