Example #1
0
        public static SpriteMetaData CreateWithFrameDict(FrameDataDict frameDataDict, Texture2D bigTexture)
        {
            SpriteMetaData spriteMetaData = new SpriteMetaData();
            int            sampleWidth    = frameDataDict.width;
            int            sampleHeight   = frameDataDict.height;

            //旋转时,宽高调换
            if (frameDataDict.rotated)
            {
                sampleWidth  = frameDataDict.height;
                sampleHeight = frameDataDict.width;
            }

            // 起始位置
            int startPosX = frameDataDict.x;
            int startPosY = bigTexture.height - (frameDataDict.y + sampleHeight);

            spriteMetaData.rect  = new Rect(startPosX, startPosY, sampleWidth, sampleHeight);
            spriteMetaData.pivot = new Vector2(0.5f, 0.5f);
            spriteMetaData.name  = frameDataDict.name;

            return(spriteMetaData);
        }
Example #2
0
        private static List <FrameDataDict> ParseFrames(PlistDictionary dFrames, int format)
        {
            List <FrameDataDict> frames = new List <FrameDataDict>();

            foreach (KeyValuePair <string, object> kv in dFrames)
            {
                if (kv.Value is PlistDictionary)
                {
                    FrameDataDict frameDataDict = new FrameDataDict();
                    frameDataDict.name = kv.Key;
                    PlistDictionary frameDict = kv.Value as PlistDictionary;
                    if (format == 2)
                    {
                        RectInt frame = PlistDictionary.ParseRectInt(frameDict["frame"] as string);
                        frameDataDict.x      = frame.x;
                        frameDataDict.y      = frame.y;
                        frameDataDict.width  = frame.width;
                        frameDataDict.height = frame.height;
                    }
                    else
                    {
                        RectInt frame = PlistDictionary.ParseRectInt(frameDict["textureRect"] as string);
                        frameDataDict.x      = frame.x;
                        frameDataDict.y      = frame.y;
                        frameDataDict.width  = frame.width;
                        frameDataDict.height = frame.height;
                    }

                    if (format == 2)
                    {
                        Vector2 offset = PlistDictionary.ParseVector2(frameDict["offset"] as string);
                        frameDataDict.offsetHeight = (int)offset.y;
                        frameDataDict.offsetWidth  = (int)offset.x;
                    }
                    else
                    {
                        Vector2 offset = PlistDictionary.ParseVector2(frameDict["spriteOffset"] as string);
                        frameDataDict.offsetHeight = (int)offset.y;
                        frameDataDict.offsetWidth  = (int)offset.x;
                    }
                    if (format == 2)
                    {
                        frameDataDict.rotated = (bool)frameDict["rotated"];
                    }
                    else
                    {
                        frameDataDict.rotated = (bool)frameDict["textureRotated"];
                    }
                    if (format == 2)
                    {
                        Vector2 size = PlistDictionary.ParseVector2(frameDict["sourceSize"] as string);
                        frameDataDict.sourceSizeWidth  = (int)size.x;
                        frameDataDict.sourceSizeHeight = (int)size.y;
                    }
                    else
                    {
                        Vector2 size = PlistDictionary.ParseVector2(frameDict["spriteSourceSize"] as string);
                        frameDataDict.sourceSizeWidth  = (int)size.x;
                        frameDataDict.sourceSizeHeight = (int)size.y;
                    }

                    frames.Add(frameDataDict);
                }
            }
            return(frames);
        }
Example #3
0
        static AnimationClip BuildAnimationClipWithSprite(Dictionary <string, Sprite> sprites, AnimationInfo animationInfo)
        {
            string        animationName = animationInfo.Name;
            AnimationClip clip          = new AnimationClip();
            int           frameCount    = animationInfo.Frames.Count + 1;

            string showImage = "showImage";
            //bindImage
            EditorCurveBinding curveBinding = new EditorCurveBinding();

            curveBinding.type         = typeof(Image);
            curveBinding.path         = showImage;
            curveBinding.propertyName = "m_Sprite";
            ObjectReferenceKeyframe[] keyFrames = new ObjectReferenceKeyframe[frameCount];

            //bind RectTransform
            EditorCurveBinding curveBindingRectx = new EditorCurveBinding();

            curveBindingRectx.type         = typeof(RectTransform);
            curveBindingRectx.path         = showImage;
            curveBindingRectx.propertyName = "m_AnchoredPosition.x";
            Keyframe[]     keyFramesRectx  = new Keyframe[frameCount];
            AnimationCurve animationCurvex = new AnimationCurve();

            EditorCurveBinding curveBindingRecty = new EditorCurveBinding();

            curveBindingRecty.type         = typeof(RectTransform);
            curveBindingRecty.path         = showImage;
            curveBindingRecty.propertyName = "m_AnchoredPosition.y";
            Keyframe[]     keyFramesRecty  = new Keyframe[frameCount];
            AnimationCurve animationCurvey = new AnimationCurve();

            //bind Size
            EditorCurveBinding curveBindingRectSizex = new EditorCurveBinding();

            curveBindingRectSizex.type         = typeof(RectTransform);
            curveBindingRectSizex.path         = showImage;
            curveBindingRectSizex.propertyName = "m_SizeDelta.x";
            Keyframe[]     keyFramesRectSizew  = new Keyframe[frameCount];
            AnimationCurve animationCurveSizew = new AnimationCurve();

            EditorCurveBinding curveBindingRectSizey = new EditorCurveBinding();

            curveBindingRectSizey.type         = typeof(RectTransform);
            curveBindingRectSizey.path         = showImage;
            curveBindingRectSizey.propertyName = "m_SizeDelta.y";
            Keyframe[]     keyFramesRectSizeh  = new Keyframe[frameCount];
            AnimationCurve animationCurveSizeh = new AnimationCurve();

            int frameRate = animationInfo.FrameRate;
            //动画长度是按秒为单位, 时间要根据帧率和帧数来算
            float currentframeTime = 0;

            for (int i = 0; i < animationInfo.Frames.Count; i++)
            {
                FrameInfo            frameInfo     = animationInfo.Frames[i];
                Parser.FrameDataDict frameDataDict = Parser.SpriteFrameMgr.frameInfos[frameInfo.Name];

                if (i == 0)
                {
                    //设第一帧参数
                    ObjectReferenceKeyframe firstObjectReferenceKeyframe = new ObjectReferenceKeyframe();
                    firstObjectReferenceKeyframe.time  = 0;
                    firstObjectReferenceKeyframe.value = sprites[frameInfo.Name];
                    keyFrames[i] = firstObjectReferenceKeyframe;

                    Keyframe firstKeyframex = new Keyframe();
                    firstKeyframex.time  = 0;
                    firstKeyframex.value = frameDataDict.offsetWidth;
                    keyFramesRectx[i]    = firstKeyframex;

                    Keyframe firstKeyframey = new Keyframe();
                    firstKeyframey.time  = 0;
                    firstKeyframey.value = frameDataDict.offsetHeight;
                    keyFramesRecty[i]    = firstKeyframey;

                    Keyframe firstKeyframew = new Keyframe();
                    firstKeyframew.time   = 0;
                    firstKeyframew.value  = frameDataDict.width;
                    keyFramesRectSizew[i] = firstKeyframew;

                    Keyframe firstKeyframeh = new Keyframe();
                    firstKeyframeh.time   = 0;
                    firstKeyframeh.value  = frameDataDict.height;
                    keyFramesRectSizeh[i] = firstKeyframeh;
                }

                ObjectReferenceKeyframe objectReferenceKeyframe = new ObjectReferenceKeyframe();
                int   circleCount = frameInfo.CircleCount;
                float time        = circleCount / (float)frameRate + currentframeTime;
                objectReferenceKeyframe.time  = time;
                objectReferenceKeyframe.value = sprites[frameInfo.Name];
                keyFrames[i + 1] = objectReferenceKeyframe;

                currentframeTime = time;

                Keyframe Keyframex = new Keyframe();
                Keyframex.time        = time;
                Keyframex.value       = frameDataDict.offsetWidth; // 以锚点构建坐标系
                keyFramesRectx[i + 1] = Keyframex;

                Keyframe Keyframey = new Keyframe();
                Keyframey.time        = time;
                Keyframey.value       = frameDataDict.offsetHeight;
                keyFramesRecty[i + 1] = Keyframey;

                Keyframe Keyframew = new Keyframe();
                Keyframew.time            = time;
                Keyframew.value           = frameDataDict.width;
                keyFramesRectSizew[i + 1] = Keyframew;

                Keyframe Keyframeh = new Keyframe();
                Keyframeh.time            = time;
                Keyframeh.value           = frameDataDict.height;
                keyFramesRectSizeh[i + 1] = Keyframeh;
            }

            animationCurvex.keys     = keyFramesRectx;
            animationCurvey.keys     = keyFramesRecty;
            animationCurveSizew.keys = keyFramesRectSizew;
            animationCurveSizeh.keys = keyFramesRectSizeh;

            for (int j = 0; j < animationCurvex.keys.Length; j++)
            {
                AnimationUtility.SetKeyRightTangentMode(animationCurvex, j, AnimationUtility.TangentMode.Constant);
            }

            for (int j = 0; j < animationCurvey.keys.Length; j++)
            {
                AnimationUtility.SetKeyRightTangentMode(animationCurvey, j, AnimationUtility.TangentMode.Constant);
            }

            for (int j = 0; j < animationCurveSizew.keys.Length; j++)
            {
                AnimationUtility.SetKeyRightTangentMode(animationCurveSizew, j, AnimationUtility.TangentMode.Constant);
            }

            for (int j = 0; j < animationCurveSizeh.keys.Length; j++)
            {
                AnimationUtility.SetKeyRightTangentMode(animationCurveSizeh, j, AnimationUtility.TangentMode.Constant);
            }

            // 动画帧率
            clip.frameRate = frameRate;
            // 动画自动循环
            AnimationClipSettings clipSettings = AnimationUtility.GetAnimationClipSettings(clip);

            clipSettings.loopTime = true;
            AnimationUtility.SetAnimationClipSettings(clip, clipSettings);

            if (!Directory.Exists(AnimationPath))
            {
                Directory.CreateDirectory(AnimationPath);
            }
            AnimationUtility.SetObjectReferenceCurve(clip, curveBinding, keyFrames);

            AnimationUtility.SetEditorCurve(clip, curveBindingRectx, animationCurvex);
            AnimationUtility.SetEditorCurve(clip, curveBindingRecty, animationCurvey);
            AnimationUtility.SetEditorCurve(clip, curveBindingRectSizex, animationCurveSizew);
            AnimationUtility.SetEditorCurve(clip, curveBindingRectSizey, animationCurveSizeh);

            AssetDatabase.CreateAsset(clip, AnimationPath + "/" + animationName + ".anim");
            AssetDatabase.SaveAssets();
            return(clip);
        }