Unity3D 动画控制器 Animator Component
文章目录
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:一个参考姿势
- 为动画添加曲线,可根据曲线的变化来改变数值
- Curve是Pameters参数,可通过GetFloat(“Curve”)获得该变化值
- 曲线可自编辑
帧事件,为动画添加帧事件
在固定的时间位置添加事件,当动画播放到该位置时会执行该方法
此方法需要在该动画附着的游戏对象身上
Function:方法名
Float,Int,Sting,Object:参数(可选)
为动画添加遮罩
Definition:遮罩定义
- None:没有遮罩
- Copy From Other Mask:复制其他的遮罩 Source:用来选择遮罩
Transform:会显示遮罩/当前骨骼的信息,需要设为遮罩的部分勾选即可
在Root Motion Node中选择根运动节点,当播放完改动画后会恢复到跟运动动画的状态
Import Messages不知道试干嘛的
———————————————————————————————————————————————————————————————————————————————————Materials 材质
———————————————————————————————————————————————————————————————————————————————————
IK动画
- 反向动力学动画,可以理解为提线木偶。要使用IK动画需要先在动画所在层勾选IK Pass
- 在脚本中,我们IK的代码要写在 OnAnimatorIK方法中才能生效
- 可以使用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:表示当前动画的总帧数,可以修改
菱形+:添加关键帧
竖条+:添加帧事件,插入帧事件后即可在Inspector中Function里选择方法
- 关于unity3d动画控制器的一些小工具的写法
- 【Unity3d】UGUI 之 Animator, Animation 动画系统学习笔记
- Unity3D中通过Animator动画状态机获取任意animation clip的准确播放持续时长
- Unity3D 新动画Animator的事件添加和使用
- 动画状态机Animator-Unity3d
- unity3D Animator 播放界面动画第一帧闪烁问题
- Unity3d 如何将Animation动画被Animator使用?
- Mecanim 动画系统(六)动画控制器 Animator Controller 界面介绍
- 动画状态机相同而动画不同的角色,需要用到AnimatorOverrideController 动画器重写控制器
- Unity3D之Mecanim动画系统学习笔记(八):Animator Layers(动画分层)
- Unity3D中的Animator动画控制
- Unity3D之Mecanim动画系统学习笔记(八):Animator Layers(动画分层)
- Unity3D——Mecanim动画 AnimatorTransitionInfo和AnimatorStateInfo 在角色移动和待机平滑切换中的应用
- Unity3D -- 自动生成动画控制器(AnimationController)
- Unity3D Animator 动态添加事件回调和替换动画
- Unity3D【脚本】获取游戏物体的Animator组件,并且修改动画属性
- Unity3D -- 自动创建动画控制器(AnimationOverrideController)
- 【unity3d study ---- 麦子学院】---------- unity3d常用组件及分析 ---------- Animator动画状态机
- unity3d中animator和animation k动画注意点和问题 无法播放等等
- Unity3D之Mecanim动画系统学习笔记(八):Animator Layers(动画分层)