U3L13-1——代码控制动画(老动画系统)

老动画系统

Unity中有两套动画系统
新:Mecanim动画系统——主要用Animator组件控制动画
老:Animation动画系统——主要用Animation组件控制动画 (Unity4之前的版本可能会用到)

目前我们为对象在Animation窗口创建的动画都会被新动画系统支配
有特殊需求或者针对一些简易动画,才会使用老动画系统

老动画系统主要用于处理老版本项目和简单的一些自制动画
新项目都不建议大家使用了

关键组件:Animation

本章代码关键字

1
2
3
4
5
6
7
8
Animation                        //老动画系统类
animation.Play() //播放动画
animation.CrossFade() //过渡播放动画
animation.PlayQueued() //队列播放动画,如果前一个动画没有播放完先等前一个动画播放完再播放
animation.CrossFadeQueued() //过渡队列播放动画,在队列播放动画的基础上过渡播放动画
animation.Stop() //停止所有当前在播的动画
animation.IsPlaying() //检测某个动画是否在播放的方法
animation.wrapMode //设置播放模式的属性

老动画系统控制动画播放

注意:
在创建动画之前为对象添加Animation组件之后再制作动画
这时制作出的动画和之前的动画格式是有区别的

Animation参数

image

  • Animation:默认播放的动画

  • Animations:该动画组件可以控制的所有动画

  • Play AutoMatically:是否一开始就自动播放默认动画

  • Animate Physics:动画是否与物理交互

  • Culling Type:决定什么时候不播放动画

    • Always Animate:始终播放
    • Based On Renderers:基于默认动画姿势剔除

老动画文件参数(与新系统有区别)

image

  • Wrap Mode:播放模式

    • Default:默认
    • Once:只播放一次
    • Loop:循环播放
    • Ping Pong:从头到尾,从尾到头播放
    • Clamp Forever:播放结束会停在最后一帧,
      并且会一直播放最后一帧(相当于状态不停止)
      表现效果和Once一样,但是逻辑处理上不同

代码控制播放

播放动画

参数填入要播放动画的名字

1
2
3
4
5
6
7
void Update()
{
if (Input.GetKeyDown(KeyCode.Alpha1))
animation.Play("1");
if (Input.GetKeyDown(KeyCode.Alpha2))
animation.Play("2");
}

淡入播放,自动产生过渡效果

当你要播放的动画的开始状态 和当前的状态 不一样时 就会产生过渡效果

注意!不一定是完全过渡到该动画的初始形态,而是过渡到一个Unity认为合适的状态再开始播放

1
2
if (Input.GetKeyDown(KeyCode.Alpha3))
animation.CrossFade("3");

前一个播放完再播放下一个

即只有上一个动画完成播放后,才会播放该动画

1
2
if (Input.GetKeyDown(KeyCode.Alpha4))
animation.PlayQueued("2");

有过渡效果的前一个播放完再播放下一个

1
2
if (Input.GetKeyDown(KeyCode.Alpha4))
animation.CrossFadeQueued("2");

停止播放所有动画

1
animation.Stop();

是否在播放某个动画

注意,与isPlaying(是否在播放动画的属性)区别开来

1
2
if (animation.IsPlaying("1"))
print("正在播放动画1");

播放模式设置

能设置的模式直接参考WrapMode内的选项即可

1
animation.wrapMode = WrapMode.Loop

其它

了解即可,之后的新动画系统会详细讲解

层级和权重以及混合(老动画系统需要通过代码来达到动画的遮罩、融合等效果)

设置层级

1
animation["1"].layer = 1;

设置权重

1
animation["1"].weight = 1;

混合模式

叠加还是混合

1
animation["1"].blendMode = AnimationBlendMode.Additive;

设置混组相关骨骼信息

1
animation[""].AddMixingTransform();

动画事件

动画事件主要用于处理 当动画播放到某一时刻想要触发某些逻辑
比如进行伤害检测、发射子弹、特效播放等等

先在动画中添加事件,再在Inspector面板上选择要执行的函数

这种参数可以设置参数,同样在Inspector面板输入参数,参数的类型可以用很多

1
2
3
4
public void AnimationEvent(int i)
{
print("动画事件触发");
}