Animation

1)、简介

  1. 主要是操作帧序列的动画系统
  2. Animation控制的是旧动画系统
  3. Animation就是一个组件
  4. 旧动画系统的组件
  5. 属于新动画系统的子集
  6. Rig标签下选择Legacy
  7. Unity默认创建的是Animator组件,我们需要手动添加Animation组件。
  8. Unity引擎没有为Animation组件提供可视化状态机,你必须用代码来驱动所有AnimationClip的变化。

2)、面板参数

参数说明
Animation默认播放的动画片段
Animations所有可以播放的动画片段
Play Automaticlly勾选以后,游戏开始会自动播放Animation中指定的动画片段
Animate Physics是有参与物理运动
Cull Type什么时候渲染
  Allways总是渲染
  Based On Renderers摄像机能看到的时候渲染

3)、API

变量说明
animatePhysics如果打开这个选项,动画会在物理循环过程中被执行。这个选项只有在结合运动学刚体的时候才有用。
clip默认的动画。
cullingType控制动画组件的剔除类型。设置类型见面板参数 Cull Type。
isPlaying有任意动画正播放?
localBounds在本地坐标空间这个动画的动画组件的AABB。
playAutomatically在启动的时候是否自动播放默认动画剪辑(Animation.clip)。
this[string]返回指定名称的动画状态(AnimationState)。
wrapMode全局设定所有动画切片播放的循环特性,动画剪辑播放完成之后,应该如何操作?

公共函数说明
AddClip添加一个指定名称的动画剪辑。注意:这些切片一定要来自于统一的FBX文件,除非是你自己做的动画可以不统一。
Blend在接下来的几秒内混合命名为animation的动画到targetWeight。(用于制定一个动画切片名字后设定这个动画切片的显示权重。显示权重:权重值越高越会覆盖别的动画)
CrossFade在一定时间内淡入名称为name的动画并且淡出其他动画。
CrossFadeQueued在前一个动画播放完成之后淡入淡出下一个动画。
GetClipCount取得该动画的动画剪辑数量。
IsPlaying名为name的动画正在播放吗?
Play不带有任何混合的播放动画。
PlayQueued在前一个动画播放完成之后直接播放下一个动画。
RemoveClip从动画列表移除剪辑。这将去掉剪辑和所有基于这个剪辑的动画状态。
Rewind倒回名称为name的动画。
Sample在当前状态对动画进行采样。
Stop停止所有当前Animation正在播放的动画。停止一个动画会让动画重回开始位置。

举例:

  1. CrossFade
  2. 混合播放,预留之前动画的一部分和将要播放的动画混合后再播放,有播放过渡的意思
  3. 举例:
  4. void CrossFade( "动画片段的名称" , int fadeLength, PlayMode.StopSameLayer );
  5. // fadeLength (与之前的动画片段融合的百分比)
  6. CrossFadeQueued
  7. 动画过渡播放的序列设定
  8. 举例:
  9. AnimationState CrossFadeQueued( "动画片段的名称" int fadeLength, QueuedMode.CompleteOthers );
  10. // QueueMode(CompleteOthers、PlayNow)
  11. AnimationState this[string name];

4)、辅助类

    AnimationClip

  1. 提供Aniamtion组件动画的基础类
  2. 他也有自己辅助函数
  3. AnimationEvent(就是当前动画切片提供我们的动画事件)

    AnimationState

  1. 用于监视当前Animation播放的动画切片的状态
  2. 功能
  3. name(动画片段的名字)
  4. clip
  5. 动画片段
  6. AnimationEvent pEvent = new AnimationEvent();
  7. pEvent.name = "Fun";
  8. pEvent.time = 0.5f;
  9. time(返回当前动作切片被播放了多久,单位是秒)
  10. time/length(计算出动画片段播放了几遍)
  11. normalizedTime
  12. 返回当前动作切片被播放了多久
  13. 单位是总时间的百分比
  14. length
  15. 返回当前切片的总时间长度,单位是秒
  16. speed
  17. 可以获取或者设置当前切片的播放速度
  18. > 1(加速播放)
  19. 01(减速播放)
  20. normalizedSpeed
  21. 可以获取或者设置当前切片的播放速度(百分比制)
  22. wrapMode
  23. 获取或设置当前切片的循环状态
  24. Default
  25. Once(只播放一次)
  26. Loop(循环播放)
  27. PingPang
  28. ClampForver(播放到最后一帧的时候,会循环播放最后一帧)

5)、切片的装载

  1. 动画切片不能独立装载(除非你装载自定义的动画切片可以独立装载)
  2. 对于FBX文件你必须将他底下存在所有动画切片一次性装回来
  3. 对于FBX文件我们使用Resoures.LoadAll(路径文件是FBX的文件名)
  4. Animation必须支持的是旧动画系统。

6)、动画事件

  1. 简介
  2. 我们可以为每个动画切片添加一些根据播放时间来确定的方法,让动画播放到我们指定的时间时激活这个方法
  3. 为了给一些动画追加特效
  4. AnimationEvent
  5. 这个事件类不是组件,所以我们需要自己实例化(他只能给AnimationClip类添加)
  6. functionName
  7. 我们可以给这个事件添加一个需要执行的方法的名字,字符串型的
  8. 注意:事件的函数体不是说非要在我们的注册脚本中,只要是在GameObject中存在这么一个函数就行了,而且不理会他的修辞
  9. messageOptions
  10. 设定当前事件对于注册方法的理会问题
  11. RequireReceiver(表示必须理会这注册函数,如果没有对应的函数体在游戏个体上不存在就报错)
  12. DontRequireReceiver(不管注册的事件函数是否存在,不存在也不报错,存在就执行)
  13. time
  14. 用于设定当前事件在对应的AnimtionClip中执行时间点
  15. 注意:时间一定要在当前切片的时间范围内
  16. 事件执行函数的参数
  17. 类型(intfloatstringUnityEngine.Object
  18. 定义
  19. 对于这个参数你只能定义一个,意识就是上述类型中你自己选一个类型
  20. 注意:Object类型指的的是Unity引擎的任意类型,不是C#语言的任意类型
  21. 获取
  22. 你定义函数实现时直接写上对应类型的行参就可以获取
  23. 传递
  24. 在创建事件对象时就需要传递好实参内容,Animation组件会自动返回你传递好的参数
  25. 注意:
  26. 事件不要重复,重复就会多次执行
  27. 事件必须添加到AnimationClip
  28. 我们可以通过AnimationClip返回对应的事件
  29. 事件在没有什么用的时候不要去添加
  30. 你可以使用AnimationState监视动画的播放情况然后执行对应函数就好了,这样可以节省效率