Exemple #1
0
        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);
        }
Exemple #2
0
        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));
        }