public AnimationClip MakeAnimationClip(GameObject root, Animation animation) { //Clear local caches lastGameObjectCache.Clear(); animationEvents.Clear(); lastKeyframeCache.Clear(); var animClip = new AnimationClip(); animClip.name = animation.Name; //Set clip to Generic type AnimationUtility.SetAnimationType(animClip, ModelImporterAnimationType.Generic); //Populate the animation curves & events MakeAnimationCurves(root, animClip, animation); //Add events to the clip AnimationUtility.SetAnimationEvents(animClip, animationEvents.ToArray()); return animClip; }
public AnimationClip MakeAnimationClip(GameObject root, Animation animation, string baseFolderPath) { //Clear local caches lastGameObjectCache.Clear(); animationEvents.Clear(); lastKeyframeCache.Clear(); spriteChangeKeys.Clear(); spriteBaseFolder = baseFolderPath; var animClip = new AnimationClip(); animClip.name = animation.Name; //Set clip to Generic type AnimationUtility.SetAnimationType(animClip, ModelImporterAnimationType.Generic); //Populate the animation curves & events MakeAnimationCurves(root, animClip, animation); return animClip; }
private void MakeAnimationCurves(GameObject root, AnimationClip animClip, Animation animation) { acb = new AnimationCurveBuilder(); //Get a list of all sprites on this GO var allSprites = root.GetComponentsInChildren<Transform>(true).Select(sr => AnimationUtility.CalculateTransformPath(sr.transform, root.transform)); //Add a key for all objects on the first frame SetGameObjectForKey(root, animClip, animation.MainlineKeys.First(), 0); foreach (var mainlineKey in animation.MainlineKeys) { var visibleSprites = SetGameObjectForKey(root, animClip, mainlineKey); var hiddenSprites = allSprites.Except(visibleSprites); HideSprites(root, hiddenSprites, mainlineKey.Time); } switch (animation.LoopType) { case LoopType.True: //Cycle back to first frame SetGameObjectForKey(root, animClip, animation.MainlineKeys.First(), animation.Length); break; case LoopType.False: //Duplicate the last key at the end time of the animation SetGameObjectForKey(root, animClip, animation.MainlineKeys.Last(), animation.Length); break; default: Debug.LogWarning("Unsupported loop type: " + animation.LoopType.ToString()); break; } //Add the curves to our animation clip //NOTE: This MUST be done before modifying the settings, thus the double switch statement acb.AddCurves(animClip); foreach (var sprite in spriteChangeKeys) { if (sprite.Value.Count > 0) { BuildSpriteChangeCurve(ref animClip, sprite); } } //Set the loop/wrap settings for the animation clip var animSettings = AnimationUtility.GetAnimationClipSettings(animClip); switch(animation.LoopType) { case LoopType.True: animClip.wrapMode = WrapMode.Loop; animSettings.loopTime = true; break; case LoopType.False: animClip.wrapMode = WrapMode.ClampForever; break; case LoopType.PingPong: animClip.wrapMode = WrapMode.PingPong; animSettings.loopTime = true; break; default: Debug.LogWarning("Unsupported loop type: " + animation.LoopType.ToString()); break; } animClip.SetAnimationSettings(animSettings); //Debug.Log(string.Format("Setting animation {0} to {1} loop mode (WrapMode:{2} LoopTime:{3}) ", animClip.name, animation.LoopType, animClip.wrapMode, animSettings.loopTime)); }