Unity Animation扩展方法总结

Posted koshio0219

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity Animation扩展方法总结相关的知识,希望对你有一定的参考价值。

在用Unity自带的Animation组件的过程中,发现很多常见的基本功能并找不到,很大程度上影响了开发者正常使用,下面写一些扩展方法来进行补充:

1.得到当前Animation正在播放的动画

吐槽:为啥只有Animator可以直接取得,Animation却不行不愉快

1     public static string GetCurrentPlayingAnimationName(this Animation animation)
2     {
3         foreach (AnimationState state in animation)
4         {
5             if (animation.IsPlaying(state.name))
6                 return state.name;
7         }
8         return null;
9     }

 

2.得到一段AnimationClip的帧数

吐槽:这么基础的功能还要自己计算哎

1     public static float GetAnimationClipTotalFrame(this AnimationClip clip)
2     {
3         return clip.length / (1 / clip.frameRate);
4     }

这里也可以转为整型来使用

 

3.按一定的速率来执行播放指定动画

1     public static void PlayAnimationWithSpeed(this Animation animation, string animationName, float speed)
2     {
3         animation[animationName].speed = speed;
4         animation.CrossFade(animationName);
5     }

 

4.得到动画播放片段当前帧

吐槽:这个主要用于做动画事件,官方那个AnimationEvent的功能着实感觉鸡肋

 1     public static int GetAnimationCurrentFrame(this Animation animation)
 2     {
 3         var animationName = GetCurrentPlayingAnimationName(animation);
 4         if (animationName != null)
 5         {
 6             var currentTime = animation[animationName].normalizedTime;
 7             float totalFrame = animation[animationName].clip.GetAnimationClipTotalFrame();
 8             return (int)(Mathf.Floor(totalFrame * currentTime) % totalFrame);
 9         }
10         return -1;
11     }

 

5.当前动画暂停和恢复播放

吐槽:为啥连这个也没有啊,而且很坑的是如果记录自带的AnimationState后只要动画停止了AnimationState也跟着复位了,所幸还是自己新建一个类吧

 1 public class AnimationStateInfo
 2 {
 3     public string name;
 4     public float time;
 5     public float speed;
 6 
 7     public AnimationStateInfo(string name,float time,float speed)
 8     {
 9         this.name = name;
10         this.time = time;
11         this.speed = speed;
12     }
13 }
 1     public static AnimationStateInfo Pause(this Animation animation)
 2     {
 3         var animationName = GetCurrentPlayingAnimationName(animation);
 4         if (animationName != null)
 5         {
 6             var time = animation[animationName].time;
 7             var speed = animation[animationName].speed;
 8             var state = new AnimationStateInfo(animationName, time, speed);
 9             animation.Stop(animationName);
10             return state;
11         }
12         return null;
13     }
 1     public static void ResumePlay(this Animation animation, string name, float speed = 1f, AnimationStateInfo state = null)
 2     {
 3         if (state != null && name == state.name)
 4         {
 5             var animationName = state.name;
 6             animation[animationName].time = state.time;
 7             animation[animationName].speed = state.speed;
 8             animation.Play(animationName);
 9         }
10         else
11         {
12             animation.PlayAnimationWithSpeed(name, speed);
13         }
14     }

 

有种Animation快要被遗弃的感觉Orz

 

以上是关于Unity Animation扩展方法总结的主要内容,如果未能解决你的问题,请参考以下文章

unity 5.6 animation与anmimator

Unity -- Animation(旧版动画组件)和Animator(新版动画器组件)

unity中legacy动画用animation播放播放,正播,倒播,重播

Unity自定义组件之序列帧播放组件

humanoid ik unity 配件 animation的问题

unity 优化整理