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); }
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); }
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); }