Animation

1)、简介

    主要是操作帧序列的动画系统
    Animation控制的是旧动画系统
    Animation就是一个组件
        旧动画系统的组件
        属于新动画系统的子集
        Rig标签下选择Legacy

    Unity默认创建的是Animator组件,我们需要手动添加Animation组件。
    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正在播放的动画。停止一个动画会让动画重回开始位置。

举例:

    CrossFade
        混合播放,预留之前动画的一部分和将要播放的动画混合后再播放,有播放过渡的意思
        举例:
            void CrossFade( "动画片段的名称" , int fadeLength, PlayMode.StopSameLayer );
            // fadeLength (与之前的动画片段融合的百分比)

    CrossFadeQueued
        动画过渡播放的序列设定
        举例:
             AnimationState CrossFadeQueued( "动画片段的名称", int fadeLength, QueuedMode.CompleteOthers );
             // QueueMode(CompleteOthers、PlayNow)

    AnimationState this[string name];

4)、辅助类

    AnimationClip

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

    AnimationState

        用于监视当前Animation播放的动画切片的状态

        功能
            name(动画片段的名字)

            clip
                动画片段
                AnimationEvent pEvent = new AnimationEvent();
                pEvent.name = "Fun";
                pEvent.time = 0.5f;

            time(返回当前动作切片被播放了多久,单位是秒)
                time/length(计算出动画片段播放了几遍)

            normalizedTime
                返回当前动作切片被播放了多久
                单位是总时间的百分比

            length
                返回当前切片的总时间长度,单位是秒

            speed
                可以获取或者设置当前切片的播放速度
                > 1(加速播放)
                0~1(减速播放)

            normalizedSpeed
                可以获取或者设置当前切片的播放速度(百分比制)

            wrapMode
                获取或设置当前切片的循环状态
                    Default
                    Once(只播放一次)
                    Loop(循环播放)
                    PingPang
                    ClampForver(播放到最后一帧的时候,会循环播放最后一帧)

5)、切片的装载

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

6)、动画事件

   简介
       我们可以为每个动画切片添加一些根据播放时间来确定的方法,让动画播放到我们指定的时间时激活这个方法
       为了给一些动画追加特效

    AnimationEvent
        这个事件类不是组件,所以我们需要自己实例化(他只能给AnimationClip类添加)
    functionName
        我们可以给这个事件添加一个需要执行的方法的名字,字符串型的
        注意:事件的函数体不是说非要在我们的注册脚本中,只要是在GameObject中存在这么一个函数就行了,而且不理会他的修辞
    messageOptions
        设定当前事件对于注册方法的理会问题
        RequireReceiver(表示必须理会这注册函数,如果没有对应的函数体在游戏个体上不存在就报错)
        DontRequireReceiver(不管注册的事件函数是否存在,不存在也不报错,存在就执行)
    time
        用于设定当前事件在对应的AnimtionClip中执行时间点
        注意:时间一定要在当前切片的时间范围内

事件执行函数的参数

    类型(int、float、string、UnityEngine.Object)
    定义
        对于这个参数你只能定义一个,意识就是上述类型中你自己选一个类型
        注意:Object类型指的的是Unity引擎的任意类型,不是C#语言的任意类型
    获取
        你定义函数实现时直接写上对应类型的行参就可以获取
    传递
        在创建事件对象时就需要传递好实参内容,Animation组件会自动返回你传递好的参数

注意:
    事件不要重复,重复就会多次执行
    事件必须添加到AnimationClip中
    我们可以通过AnimationClip返回对应的事件
    事件在没有什么用的时候不要去添加
    你可以使用AnimationState监视动画的播放情况然后执行对应函数就好了,这样可以节省效率