Пример #1
0
        public void CreateAnimation(ImportedAnimation anim, string basePath, string masterName, AnimationTargetObjectType targetType)
        {
            AnimationClip clip;
            string        fileName  = basePath + "/" + masterName + "_" + anim.name + ".anim";
            bool          isLooping = anim.isLooping;

            // check if animation file already exists
            clip = AssetDatabase.LoadAssetAtPath <AnimationClip>(fileName);
            if (clip != null)
            {
                // get previous animation settings
                targetType = PreviousImportSettings.GetAnimationTargetFromExistingClip(clip);
            }
            else
            {
                clip = new AnimationClip();
                AssetDatabase.CreateAsset(clip, fileName);
            }

            // change loop settings
            if (isLooping)
            {
                clip.wrapMode = WrapMode.Loop;
                clip.SetLoop(true);
            }
            else
            {
                clip.wrapMode = WrapMode.Clamp;
                clip.SetLoop(false);
            }

            ObjectReferenceKeyframe[] keyFrames = new ObjectReferenceKeyframe[anim.Count + 1];             // one more than sprites because we repeat the last sprite

            for (int i = 0; i < anim.Count; i++)
            {
                ObjectReferenceKeyframe keyFrame = new ObjectReferenceKeyframe {
                    time = anim.GetKeyFrameTime(i)
                };

                Sprite sprite = anim.frames[i].sprite;
                keyFrame.value = sprite;
                keyFrames[i]   = keyFrame;
            }

            // repeating the last frame at a point "just before the end" so the animation gets its correct length

            ObjectReferenceKeyframe lastKeyFrame = new ObjectReferenceKeyframe {
                time = anim.GetLastKeyFrameTime(clip.frameRate)
            };

            Sprite lastSprite = anim.frames[anim.Count - 1].sprite;

            lastKeyFrame.value    = lastSprite;
            keyFrames[anim.Count] = lastKeyFrame;

            // save curve into clip, either for SpriteRenderer, Image, or both
            if (targetType == AnimationTargetObjectType.SpriteRenderer)
            {
                //var bnds = AnimationUtility.GetObjectReferenceCurveBindings(clip);

                AnimationUtility.SetObjectReferenceCurve(clip, AnimationClipUtility.spriteRendererCurveBinding(AnimationImporter.Instance.useFileNameAsPath ? masterName : AnimationImporter.Instance.objectPath), keyFrames);
                AnimationUtility.SetObjectReferenceCurve(clip, AnimationClipUtility.imageCurveBinding(AnimationImporter.Instance.useFileNameAsPath ? masterName : AnimationImporter.Instance.objectPath), null);
            }
            else if (targetType == AnimationTargetObjectType.Image)
            {
                AnimationUtility.SetObjectReferenceCurve(clip, AnimationClipUtility.spriteRendererCurveBinding(AnimationImporter.Instance.useFileNameAsPath ? masterName : AnimationImporter.Instance.objectPath), null);
                AnimationUtility.SetObjectReferenceCurve(clip, AnimationClipUtility.imageCurveBinding(AnimationImporter.Instance.useFileNameAsPath ? masterName : AnimationImporter.Instance.objectPath), keyFrames);
            }
            else if (targetType == AnimationTargetObjectType.SpriteRendererAndImage)
            {
                AnimationUtility.SetObjectReferenceCurve(clip, AnimationClipUtility.spriteRendererCurveBinding(AnimationImporter.Instance.useFileNameAsPath ? masterName : AnimationImporter.Instance.objectPath), keyFrames);
                AnimationUtility.SetObjectReferenceCurve(clip, AnimationClipUtility.imageCurveBinding(AnimationImporter.Instance.useFileNameAsPath ? masterName : AnimationImporter.Instance.objectPath), keyFrames);
            }

            EditorUtility.SetDirty(clip);
            anim.animationClip = clip;
        }