private static List <Sprite> CreateSpritesForAtlas(Texture2D atlas, SpriteSheetData sheetData) { var sprites = new List <Sprite>(sheetData.frames.Length); foreach (SpriteSheetData.Frame frame in sheetData.frames) { Vector2 pivot = new Vector2( (frame.sourceSize.w * 0.5f - frame.spriteSourceSize.x) / frame.spriteSourceSize.w, (frame.sourceSize.h * 0.5f - (frame.sourceSize.h - frame.spriteSourceSize.y - frame.spriteSourceSize.h)) / frame.spriteSourceSize.h ); UnityEngine.Rect rect = frame.GetUnityTextureRect(sheetData.meta.size.h); Sprite sprite = Sprite.Create( atlas, rect, pivot, 16 ); sprite.name = frame.filename; sprites.Add(sprite); } return(sprites); }
private GeneratedClip[] CreateAnimationClips(Settings settings, AsepriteFileInfo aseInfo, List <Sprite> sprites) { SpriteSheetData sheetData = aseInfo.spriteSheetData; var clipInfoLookup = new Dictionary <string, List <(Sprite sprite, int duration)> >(); foreach (SpriteSheetData.FrameTag frameTag in sheetData.meta.frameTags) { var framesInfo = new List <(Sprite sprite, int duration)>(); for (int i = frameTag.from; i <= frameTag.to; i++) { SpriteSheetData.Frame frame = sheetData.frames[i]; Sprite sprite = sprites.Find((s) => { return(frame.filename.Equals(s.name)); }); if (ReferenceEquals(sprite, null)) { continue; } int duration = frame.duration; framesInfo.Add((sprite, duration)); } string clipName = $"aseprite_{aseInfo.title}_{frameTag.name}"; clipInfoLookup.Add(clipName, framesInfo); } var clips = new List <AnimationClip>(clipInfoLookup.Count); foreach (var kvp in clipInfoLookup) { string clipName = kvp.Key; List <(Sprite sprite, int duration)> clipInfo = kvp.Value; AnimationClip clip = new AnimationClip(); clip.wrapMode = WrapMode.Loop; clip.name = clipName; int[] frameTimesInMilliseconds = new int[clipInfo.Count]; for (int iFrame = 0; iFrame < frameTimesInMilliseconds.Length; iFrame++) { frameTimesInMilliseconds[iFrame] = clipInfo[iFrame].duration; } clip.frameRate = ClipSettings.CalculateAutoFrameRate(settings.MaxSampleRate, frameTimesInMilliseconds); AnimationClipSettings currentClipSettings = AnimationUtility.GetAnimationClipSettings(clip); currentClipSettings.loopTime = true; AnimationUtility.SetAnimationClipSettings(clip, currentClipSettings); var spriteBinding = new EditorCurveBinding(); spriteBinding.type = typeof(SpriteRenderer); spriteBinding.path = clipSettings.spriteRendererPath; spriteBinding.propertyName = "m_Sprite"; int clipLength = clipInfo.Count; var keyframes = new List <ObjectReferenceKeyframe>(clipLength + 1); float currentDuration = 0f; for (int i = 0; i < clipLength; i++) { var keyframe = new ObjectReferenceKeyframe(); keyframe.value = clipInfo[i].sprite; keyframe.time = currentDuration; keyframes.Add(keyframe); // Divide frame duration by 1000 because it is specified by Aseprite in milliseconds. float keyDuration = clipInfo[i].duration / 1000f; currentDuration += keyDuration; // TODO: Miscreant: Do these calculations before any sec/msec conversions for more precision // Tack on a duplicate of the last keyframe to ensure the last frame gets its full duration if (i == clipLength - 1 && keyDuration > (1.0f / clip.frameRate)) { keyframe = new ObjectReferenceKeyframe(); // The last frame will persist for one full sample, so subtract that from the current time keyframe.time = currentDuration - (1.0f / clip.frameRate); keyframe.value = clipInfo[i].sprite; keyframes.Add(keyframe); } } AnimationUtility.SetObjectReferenceCurve( clip, spriteBinding, keyframes.ToArray() ); clips.Add(clip); } return(FinalizeAnimationClips(aseInfo, clips)); }