您的位置:首页 > 移动开发 > Unity3D

Unity3D 动画控制器 Animator Component

2020-07-18 04:11 621 查看

文章目录

  • 动画融合树 Blend Tree
  • 动画设置
  • IK动画
  • 动画状态机(继承StateMachineBehaviour)
  • 动画制作 Animation View
  • Animator 组件


    Controller:放置动画控制器 Animator Controller
    Avatar:放置模型的骨骼
    Apply Root Motion:使用根动画,勾选此项会根据动画产生实际的位移
    Update Mode:更新模式

    • Normal:表示使用Update进行更新
    • Animate Physics:表示使用FixUpdate进行更新(一般用在和物体有交互的情况下)
    • Unscale Time:表示无视timeScale进行更新(使用timeScale暂停了游戏也能用,比如UI)

    Culling Mode:剔除模式

    • Always Animate:就算摄像机看不到动画还要继续播放
    • Cull Update Transform:摄像机看不见不更新,但是位置更新还是有的
    • Cull Completely:只要摄像机看不见就啥也不动

    Animator Controller 动画控制器


    上图所示的是建立动画控制器后的3个默认状态
    Any State:表示任意的状态,指向的状态是在任意时刻都可以切换过去的状态,比如对象死亡
    Entry:表示当进入当前状态机时的入口
    Exit:表示退出当前的状态机

    自建状态

    1.右键菜单

    Create State:创建状态

    • Empty:空状态,没有任何动画
    • From Selected Clip:选中一个动画片段后创建状态,一个动画
    • From New Blend Tree :融合树,多个动画的融合

    Create Sub - State Machine:创建子状态机,如果动画太多可以用这个避免状态机臃肿
    Paste:粘贴状态
    Copy current StateMachine:复制当前状态机

    2.在状态上右键

    Make Transition:动画过度
    Set as Layer Default State:设置为默认动画
    Copy:复制状态
    Create new Blendtree in State:以该动画片段创建新的混合树
    Delete:删除

    3.Animator Layers


    Weight:权重,默认的Base Layer必须为1,值为0表示不播放,层与层之间的关系类似融合树
    Mask:动画的遮罩,里面是骨骼信息
    Blending:动画的混合方式

    • Override:覆盖,表示当前层的动画会覆盖掉其它权重低的动画,比如招手播放时右手就不能播放其它的动画了
    • Additive:添加,表示当前层的动画的量添加到其它权重低的动画,比如招手播放时,手部奔跑或站立的甩动也会保留

    Sync:复制其它层
    勾选此项会在下方出现一个新的属性 Source Layer用来选择要复制的层
    Timing:勾选此项表示改成和Sync复制的层的动画持续时间不一致时按照自己的速度来
    IK Pass:使用IK动画(后面会讲到)

    4.Animator Pameters

    点击右上角的 + 号,可以添加动画过渡时的参数

    • Float:float类型的参数,有大于和小于两种比较状态,在融合树中用的比较多
    • Int:int类型的参数,有大于、小于和等于三种比较状态
    • Bool:bool类型参数,多用于状态切换;
    • Trigger:本质上也是一个bool类型的参数,但是其值默认为false,且设置为true后系统会自动将其还原为false;
    // 设置参数
    ani.SetInteger("Float)参数名", 0f);
    ani.SetInteger("(Int)参数名", 0);
    ani.SetInteger("(Bool)参数名", true);
    ani.SetInteger("(Trigger)参数名");
    // 获得参数状态
    ani.SetInteger("(Float)参数名", 0f);
    ani.SetInteger("(Int)参数名", 0);
    ani.SetInteger("(Bool)参数名", true);
    // 获取当前层动画状态信息
    ani.GetCurrentAnimatorStateInfo(0(动画所在层)).IsName("LocalMotion"(动画名));
    // 将字符串转换为哈希ID,整型数据比字符串的操作要好很多,建议使用这个方法
    Animator.StringToHash("动画名");

    5.动画过度


    Has Exit Time:勾选此项可以立刻转到下一个动画状态,不必等当前状态播放完毕
    Settings:设置
    Exit Time:退出的时间
    Fixed Duration:固定时间,如果选中了固定时间框,则转换时间以秒为单位进行解释。如果固定时间框未选中,则将转换时间解释为源状态的标准化时间的一小部分。
    Transition Duration:过渡时间,在标准化时间内,相对于当前状态的持续时间
    Transition Offset:源状态转换到目标状态过程中的偏移时间,值为0.5意味着目源状态开始以过载50%通过自己的时间线
    Interruption Source:使用此控件可以控制此转换可能中断的情况

    • None:关闭Interruption Source选项
    • Current State:从当前源打断
    • Next State:从下一个源打断
    • Current State Then Next State:优先从当前源打断,如果当前源不能切换到下一个状态则从下一个源打断
    • Next State Then Current State:则相反

    Ordered Interruption:确定当前转换是否可以独立于其他转化中断
    Conditions:转换的条件(就是上面的那些Float、Int、Bool和Trigger)

    动画融合树 Blend Tree

    融合树将多个动画融合到了一起,一般用在多个不同方向的动画,且参数类型必须是浮点型,双击Blend Tree即可进入融合树的编辑。

    一维融合树

    Bland Type 为1D即为一维融合树,动画只能两个两个的融合。
    Parameter:选择参数
    Motion:添加动画片段后者新的融合树,添加方式如下

    • 右击视图中的Blend Tree,在右键菜单中添加
    • 点击上图中右下角的 + 号添加

    Thresholds:设置临界值, 后面的时钟表示改动作播放的速度
    Automate Thresholds:自动设置临界值
    Compute Thresholds:如果不勾选Automate Thresholds,就会出现此属性

    • Select:Root Motion的移动速度
    • Velocity X:Root Motion 的速度向量的x值
    • Velocity Y:Root Motion 的速度向量的y值
    • Velocity Z:Root Motion 的速度向量的z值
    • Angular Speed(Rad):Root Motion 的旋转速度 弧度
    • Angular Speed(Deg):Root Motion 的旋转速度 角度

    二维融合树

    Bland Type:2D Simple Directional:所有被融合的动画⽅向不⼀致,
    Bland Type:2D Freedom Directional:相⽐第⼀个,需要⼀个没有⽅向的动画,允许一个方向上设置多个动作
    Bland Type:2D Freedom Cartesian:随意融合

    内容基本和一维融合树相同,区别在于有两个参数进行控制,图中的红点当前位置,后方的菱形表示中心位置(0,0)
    Compute Positions:指定从动画文件中获取参数及其范围

    • Velocity XZ:根据各个运动的 velocity.x 设置其“位置 X”(Pos X),并根据其 velocity.z 设置其“位置 Y”(Pos Y)
    • Speed and Angular Speed :根据各个运动的角速度(以弧度/秒为单位)设置其“位置 X”(Pos X),并根据其速度设置其“位置 Y”(Pos Y)
    • PositionX from:计算X,Y保持不变进行混合和匹配,子菜单与1维相同
    • PositionY from:计算Y,X保持不变进行混合和匹配,子菜单与1维相同

    Direct

    根据权重直接混合多个动画,通常用来实现表情动画。

    添加动作后,需要为每个动作设置其控制参数,来进行控制。
    Normallized Blend Valus:标准化的混合值
    Adjust Time Scale:调整时间尺度

    • Homogeneous Speed:均速
    • Reset Time Scale:复位时间尺度

    动画设置

    动画状态


    顶部为动画名称
    其下为动画标签
    Motion:这状态的动画片段
    Speed:动画的播放速度,值越大越快
    Multiplier:乘数,我的理解是勾选右边的复选框后,在参数列表中选择一个整型来控制播放速度(按倍数算)
    Normalized Time标准化时间.
    Mirror:动画镜像
    CYcle Offset:播放偏移量
    Foot IK:脚部动画的IK
    Write Defaults:动画播放完毕后是否将状态重置为默认状态
    Transitions:此动画的过度
    Solo:勾选表示当前过渡为唯一过渡,即当前状态只能过渡到这个项目指向的状态
    Mute:勾选表示使这个动画过渡关闭,即当前状态不能过渡到这个项目指向的状态

    动画设置

    Model 模型


    Scale Factor:缩放系数,模型的缩放
    Use File Scale:是否开启文件压缩
    File Scale:文件的缩放
    Mesh Compression:网格压缩

    • Off 不压缩
    • Low 低压缩
    • Medium 中等压缩
    • High 高压缩

    Read/Write Enabled:是否启用读/写操作
    Optimize Mesh:优化网格
    Import BlendShapes:导入混合模型
    Generate Colliders:生成碰撞体
    Keep Quads:开启则网格采用四边形,否则采用三角形
    Index Format:索引格式,定义网格索引缓冲区的大小

    • Auto:导入网格是自动选择16为还是32为索引
    • 16 bit:使Unity在导入网格物体时始终使用16位索引
    • 32 bit:使Unity在导入网格物体时始终使用32位索引

    Weld Vertices:焊接顶点,通过减少网格的总数,可以优化网格上的顶点数,默认选项
    Import Visibility:是否可见,导入FBX时启用MeshRenderer组件
    Import Cameras:是否导入相机
    Import Lights:是否导入光
    Preserve Hierarchy:保留层次结构,就是模型对象在Hierarchy里的层级结构(我认为)
    Swap UVs:交换UV。如果光照贴图识别了错误的UV通道,选中该项,可以交换第一、第二UV通道
    Generate Lightmap UVs:生成光照贴图UV通道,如果勾选此项会出现Advanced高级选项

    • Hard Angle:硬边角度,该选项用来控制相邻三角面夹角的阀值,可根据网格的形状去调节,设置哪些边将作为硬边和接缝处理。如果设置这个值为180度,那么所有的边角都会被圆滑,默认值为88
    • Pack Margin:紧缩间隔。这个选项控制UV坐标簇的间隔,会尽量减少UV坐标簇的间隔,从而在最大程度上利用生成光照贴图资源,默认值为4
    • Angle Error :角度误差。网格面片夹角可能影响的最大UV角度误差,用来控制给予原始网格影响UV坐标簇相似程度的百分比(值越大相似三角面越多)。设置一个较小的数值可以避免烘焙光照贴图时产生问题,默认设置为8
    • 面积误差。网格面积可能影响的最大UV面积误差,用来控制基于原始网格相对UV坐标簇面积相似程度的百分比,将此值设置一个较大的数值可以得到更完整的UV坐标簇,默认设置15
    • 引用链接

    Normals:法线,定义是否以及如何计算法线,这对于优化游戏大小很有用

    • Import:默认选项,从文件导入法线
    • Calculate:根据平滑角(Smoothing angle)1计算法线,如果选择,则启用“ 平滑角度”,值可在0~180之间调,整默认为60
    • None:无,如果模型即不需要法线贴图映射,也不需要实时光照影响,则选择该选项

    Normals Mode:法线模式,定义Unity如何计算法线,仅在将法线设置为Calculate时可用

    • Unweighted Legacy:为加权(旧版),在将项目迁移到最新版本的Unity之前,这是所有导入的FBX预制件的默认设置
    • Unweighted:为加权,法线不加权
    • Area Weighted:面积加权,发现由模型的面积加权
    • Angle Weighted:角度加权,法线由每个面上的顶角加权
    • Area and Angle Weighted:面积和角度加权,默认选项

    Smoothing Angle :平滑角度,设置网格面片的夹角阀值,作用于调节法线贴图切线
    Tangents:切线

    • Import:依据在三维软件中设置的方式计算切线和副法线
    • Calculate Tangent Space:计算切线空间,默认选项,使用MikkTSpace计算切线和副法线
    • Calculate Legacy:传统计算,使用传统算法计算切线
    • Calculate Legacy - Split Tangent:计算-切线正切,使用传统算法计算切线,并跨UV图表进行拆分,如果法线贴图照明被网格上的接缝破坏,就选择此选项
    • None:不导入顶点切线
    ———————————————————————————————————————————————————————————————————————————————————
    Rig 装置


    Animation Type:动画类型

    • None:无,不存在动画
    • Legacy:旧版动画系统
    • Generic:通用动画系统
    • Humanoid:人型动画系统

    Avatar我的理解就是骨骼骨骼
    Avatar Definition:Avatar 定义

    • Create from this model:从此模型创建
    • Copy from other Avatar:从其他 Avatar 复制

    Configure…:指向其他模型上设置的 Avatar 配置
    Optimize Game Object:优化游戏对象

    ———————————————————————————————————————————————————————————————————————————————————
    Animation

    上部分

    Import Animation:勾选后才可以导入动画到 Unity 工程中
    Bake Ainmations:这个选项只在使用 Humanoid 动画并且使用到了 IK 特性的时候才可用
    Anim.Compression:应用于此网格物体的动画的压缩类型

    • Off:关闭动画压缩
    • Keyframe Reduction:压缩关键帧,就是 Unity 会自行重采样动画的关键帧
    • Optimal:最优化压缩

    当Anim.Compression为Keyframe Reduction 或者 Optimal 时,才会出现以下三个用于控制压缩选项的系数配置

    • Rotation Error:旋转误差
    • Position Error:位置误差
    • Scale Error:比例误差

    越小精度就越高,动画的失真度就越小
    Animated Custom Propertie:导入任何您指定为自定义用户属性的FBX属性
    Clips:动画片段
    Start:开始时间
    End:结束时间

    下半部分

    Loop time:动画是否循环播放

    • Loop Pose:用于控制动画循环播放时,从结束帧切换到起始帧时,动画的动作是否可以无缝的衔接上
    • Cycly Offset:用于设置控制循环的时候起始帧偏移量

    Root Transform Rotation:表示为播放动画的对象的旋转方面的信息

    • Bake Into Pose:不勾选表示动画产生的旋转或位移会应用到播放动画的主体对象上,勾选则表示不会应用到播放动画的主体对象上
    • Based Upon:基准点 Original:动画文件中指定的旋转值
    • Root Node Rotation:动画文件中指定的根节点旋转信息

    Root Transform Position(Y):表示为播放动画的对象的位置 y 轴方面的信息

    • Bake Into Pose:不勾选表示动画产生的旋转或位移会应用到播放动画的主体对象上,勾选则表示不会应用到播放动画的主体对象上(Y轴上不会产生位移)

    • Based Upon:基准点

      Original:表示基准点使用在动画文件中预设好的值
    • Center of Mass:表示基准点使用质量中心,表现为人物下半身会嵌入地面
    • Feet:表示基准点使用第一帧的脚

    Root Transform Position(XZ):表示为播放动画的对象的位置 XZ 平面方面的信息

    • Bake Into Pose:不勾选表示动画产生的旋转或位移会应用到播放动画的主体对象上,勾选则表示不会应用到播放动画的主体对象上(在XZ面上不会产生位移)

    • Based Upon:基准点

      Original:表示基准点使用在动画文件中预设好的值
    • Center of Mass:表示基准点使用质量中心,表现为人物下半身会嵌入地面
    • Feet:表示基准点使用第一帧的脚

    Mirror:左右镜像,比如一个动画是往左前方跑,勾选Mirror后,该动画网右前方跑
    Additive Reference Po:一个参考姿势

    1. 为动画添加曲线,可根据曲线的变化来改变数值
    2. Curve是Pameters参数,可通过GetFloat(“Curve”)获得该变化值
    3. 曲线可自编辑


    帧事件,为动画添加帧事件
    在固定的时间位置添加事件,当动画播放到该位置时会执行该方法
    此方法需要在该动画附着的游戏对象身上
    Function:方法名
    Float,Int,Sting,Object:参数(可选)

    为动画添加遮罩
    Definition:遮罩定义

    • None:没有遮罩
    • Copy From Other Mask:复制其他的遮罩 Source:用来选择遮罩
  • Create From This Model:在此动画的骨骼上建立遮罩
  • Transform:会显示遮罩/当前骨骼的信息,需要设为遮罩的部分勾选即可

    在Root Motion Node中选择根运动节点,当播放完改动画后会恢复到跟运动动画的状态
    Import Messages不知道试干嘛的

    ———————————————————————————————————————————————————————————————————————————————————
    Materials 材质

    ———————————————————————————————————————————————————————————————————————————————————

    IK动画

    1. 反向动力学动画,可以理解为提线木偶。要使用IK动画需要先在动画所在层勾选IK Pass
    2. 在脚本中,我们IK的代码要写在 OnAnimatorIK方法中才能生效
    3. 可以使用IK动画的部位有 头部,左手,左脚,右手,右脚


    头部IK设置:

    // 设置权重
    ani.SetLookAtWeight(1);
    ani.SetLookAtWeight(weight, bodyWeight = 0.0f, headWeight = 1.0f, eyesWeight = 0.0f, clampWeight = 0.5f);
    // Weight 全局权重
    // bodyWeight 身体权重
    // headWeight 头部权重
    // eyesWeight 眼睛权重
    // clampWeight 权重的限制 0代表没有限制(脖子可能看起来和断了一样),1代表完全限制(头几乎不会动,像是固定住了)。0.5代表可能范围的一半(180度)
    // 看向目标位置
    ani.SetLookAtPosition(Target.position);

    其他部位IK设置

    // 设置位置和旋转的权重(除了头部之外都需要设置)
    // AvatarIKGoal是一个枚举类
    // LeftHand 左手
    // LeftFoot 左脚
    // RightHand 右手
    // RightFoot 右脚
    ani.SetIKPositionWeight(AvatarIKGoal.RightHand, 1f);
    ani.SetIKRotationWeight(AvatarIKGoal.RightHand, 1f);
    // 末节点的位置和旋转
    ani.SetIKPosition(AvatarIKGoal.RightHand, Target.position);
    ani.SetIKRotation(AvatarIKGoal.RightHand, Target.rotation);

    动画状态机(继承StateMachineBehaviour)

    检测状态机中动画切片(Anamation)的运行状态
    OnStateEnter :进⼊状态时执⾏⼀次
    OnStateUpdate: 在状态中,每帧执⾏⼀次
    OnStateExit: 离开状态时执⾏⼀次
    OnStateMove: 执⾏动作的时候每帧执⾏⼀次
    OnStateIK: 执⾏IK动画时每帧执⾏⼀次

    动画制作 Animation View

    使用快捷键Ctrl + 6或Window ==》Animation 打开Animation的编辑窗口

    点击 Create 创建动画片段

    点击 Add Property 选择需要做动画的部分,点击 + 进行编辑

    红点录制功能,先选择关键帧或者在需要的地方,点击录制按钮即可在场景中进行操作即可完成录制并建立关键帧
    之后的是 第一帧 上一帧 暂停/开始 下一帧 最后一帧 最后是当前所在帧数
    New Animation:可以切换动画片段,也可以添加新的动画片段
    Samples:表示当前动画的总帧数,可以修改
    菱形+:添加关键帧
    竖条+:添加帧事件,插入帧事件后即可在InspectorFunction里选择方法

    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: