Unity学习日志_动画系统简介
Animation,Legacy动画系统
若要使用Animation,需要在创建Clip之前为物体手动添加Animation组件。
Animation组件面板:
属性:
- Animation:动画片段。
- Animations:片段数组。
- Play Automatically:自动播放。
- Animate Phsics:如果设为true,那么动画将会在 FixedUpdate 中循环,这个只有和运动学刚体一起用才有效。
- Culling Type:分为总是播放(Always Animate),渲染时播放(Based On Render)
Animaiton录制器:
面板:
从左上开始向右介绍:
-
:开始录制动画,也可以直接修改属性值进行录制。
-
:回到起始帧。
-
:回退一帧。
-
:播放动画。
-
:前进一帧。
-
:到达终止帧。
-
:采样值,值越小,动画播放的速度越慢。
-
:添加关键帧。
-
:添加动画事件。选中添加的事件标签后在inspector面板中可选择要触发的方法。
-
:添加要录制的组件。
-
:时间线显示动画关键帧。
-
:曲线图显示动画的关键帧。
代码控制:
使用Animation类的方法进行控制。
倒放动画:
Animation ani = GetComponent<Animation>();
ani["die"].time = ani["die"].length;
ani["die"].speed = -1f;
ani.Play("die");
Animator,Mecanim动画系统
Mecanim动画系统优点:
- 针对人形角色提供了一种特殊的工作流,包含Avatar的创建和对肌肉的调节。
- 动画重定向的能力,可以非常方便地把动画从一个角色模型应用到其他角色模型上。前提是模型是类人的。
- 提供了可视化Animator视窗,可以直观地通过动画参数和Transition等管理各个动画间的过度。
两种模型:
人形角色设置(Humanoid)动画可以通用。动画重定向。
非人性(通用)角色设置(Generic)动画不可以通用。
模型导入界面:
1. Model常用设置简介:
- Scale Factor:模型缩放,推荐使用这个属性而不是使用transform中的Scale。Scale可能导致模型失真。
- Convert Units:是否单位转换。
- Import BlendShapes:导入Blendshapes(用于表情动画)。
- Mesh Compression:网格压缩,会导致失真。
- Read/Write Enable:模型可以发生形变说明模型可读可写。
- Optimize Mesh:最优化网格。
- Generate Colliders:根据模型生成碰撞器。
- KeepQuads:保持四边形,不转换为三角形。我们在U3D中使用的网格,大部分是把所有的面都转换成了三角形,但是某些特定的需求下,四边形会得到更好的效果,例如Tessellation shaders(细分曲面着色器)。
- Weld Vertices:焊接顶点,如果开启,相同位置的顶点会被合并。
2. Rig常用设置简介:
- Animation Type:None(无),Legacy(旧动画系统),Generic(通用),Humanoid(类人)
- Avatar Definition:骨骼动画导入模式,Create From This Model(根据本模型创建),Copy From other Avatar(套用其他骨骼动画)
- Root Node:根节点。(Generic中的独有选项)
- Optimize Game Object:最优化模型。
3. Animation常用设置简介:
- Import Animation:导入动画。
- Anim. Compression:动画压缩方式。有Off(不压缩),Keyframe Reduction(减少关键帧),Optimal(最优化)
- Rotation Error,Position Error,Scale Error:数值越大,动画越不准确,性能越好;数值越小,动画越准确,性能越差。
- Clips:动画裁剪。
4. 动画裁剪
- Start:动画开始处。
- End:动画结束处
- Loop Time:循环。
- Loop Pose:实现动作无缝衔接,循环匹配的时候,loop match为绿色。
- Cycle offset:动画偏移量。
- Root Transform:设置根变化。
- Bake Into Pose:勾选之后将无视动画造成的对应数值改变(有些动画可能会造成模型位移或者旋转,勾选之后会无视掉)。
- Miroor:镜面,勾选后,动画将左右颠倒播放。
- Curves:曲线
- Events :事件,添加原理和Animation相同。
- Mask:遮罩,控制器中会详细说明。
5. Materials:
- Import Materials 是否导入材质。如果否,则不生成新的材质,默认使用“Default-Diffuse”。
- Naming 材质命名方式。
- Search 材质搜索方式。
Animator面板:
1. 属性:
- Controller:动画控制器。
- Avatar:模型骨骼。
- Apply Root Motion:是否使用动画自带的位移。
- Update Mode:动画更新模式,有Normal(Update更新),Animation Physics(FixedUpdate更新),Unscaled Time(无视ScaleTime的Update更新)。
- Culling Mode:动画裁剪模式(当相机看不到游戏对象时)有Always Animate(一直更新),Cull Update Transform(Transform重定向),Cull Completely(完全禁用)
2. Avatar:
选择类人动画才可以使用该界面,当类人骨骼自动匹配失败时,可以选择Rig -》Configure来打开并手动配置。
- Mapping:
- Clear:清空。
- Automap:自动适配骨骼。
- load:导入骨骼信息。
- save:保存骨骼信息。
- Pose:模型摆出的姿势。
- Sample Bind-Pose:模型初始姿势。
- Enforce T-Pose:使模型摆出T姿势。
- Muscles&Settings:此界面可以调节具体的骨骼动画参数并观察效果,可以用于检测模型骨骼动画是否正常等。
动画控制器/状态机:
Animator可以在Project面板创建。
1. 右键菜单栏:
- Create State:创建动画状态,有Empty(空状态),From New Blend Tree(创建混合树)
- Create sub-State Machine:创建新的子状态机。可以将一个系列的连续动画做成一个子状态机来使用。
- Copy current StateMachine:复制当前状态机。
2. Parameters:
- Float
- Int
- Bool
- Trigger:使用一次之后自动失效。
- 设置方法:Animator中的set&get方法。
3. Layers:
通过设置多层动画和Mask遮罩实现多种动画一起使用,比如在跑动的时候攻击。用户可以通过“+”来创建新的动画图层。
-
Weight:层权重,权重越高,则本层中的动画优先级越高。多层最高权重则按层级创建顺序决定先后。
-
Mask:遮罩,设置为绿色的为本层可以使用的躯体动画,红色为本层不可使用的躯体动画。
-
Blending:动画覆盖的方式:有Override(重写,覆盖),Additve(累加,在原动画层动画的基础上来进行本层的动画)
-
IKpass:是否开启反向运动学,开启反向运动学之后可以使用代码通过子物体来控制父物体。在后面的代码控制详细举例。
4. 动画状态:
- Entry:进入状态机,Entry所连的动画状态为初始状态。
- Any State:任何状态都可以直接转为Any State所连的动画状态,应当配合参数使用。
- Exit:退出状态机,退出后会再次进入状态机。
动画状态监视器:
此面板为控制器中添加状态后点击状态可以查看的面板。
1. 右键菜单栏:
- Make Transition:拉出过渡线
- Set as Layer Default State:设为本层的默认动画(进入状态机后最先被调用的状态)。
- Copy:复制
- Create new BlendTree in State:在该状态中创建混合树。
- Delete:删除该状态。
2. 属性:
- Motion:动画片段。
- Speed:播放速度。
- Multiplier:速度的乘数。
- Parameter:是否使用参数调节左侧属性。
- Normalized Time:标准化时间。
- Mirror:镜像。
- Cycle Offset:动画周期偏移量。
- Foot IK:是否使用脚步动画约束。
- Write Defaults:是否对没有动画的属性写回默认值。
- Transitions:过渡线/转换。
过渡线/转换面板:
- Transtions:过渡线,Solo表示:源状态中只有过渡线可用;Mute:禁用该条过渡线。
- 当一个Solo被勾选,则该状态的其他过渡/转换会被Mute。
- 如果一个过渡/转换的Solo和Mute同时被勾选,则表现为Mute。
- Has Exit Time:动画过渡时是否有固定的退出时间(动画状态是否可以被直接打断)。 当勾选时只有当动画播放完后才可以进入下一状态。
- Exit Time:动画过渡时本状态的退出时间。
- Transtions Duration:转换持续时间。
- Transtion offset:目的状态偏移量,形象说就是时间轴中目的状态的位置。
- settings下面的时间轴是设置过渡时间段用的。
- Conditions:设置本过渡线的条件,条件取自控制器中的Parameter,分为三大部分:条件参数(取决于Parameter),条件谓词(条件逻辑词),条件值。
脚本控制:
注:Animator类通过AnimatorStateInfo类来获取当前某层的动画状态信息,通过isname方法来判断某个动画是否正在播放。
Animator常使用set方法通过设置过渡线上条件参数的值从而控制动画的播放和切换。
动画事件进阶:
在Animator中添加事件我们常常将动画事件类分为两大部分:
-
事件行为类EventBehaviour:此类中存放要挂在Event时间轴上的方法,充当事件源,方法内部则为要触发的事件(面向对象封装),挂载在模型上。如图:
-
事件类Event:此类负责充当监听者,负责事件的具体实现,挂载在模型空父物体上。如图:
注:Animator动画事件只会检测用户后添加的脚本是否含有对应事件名
混合树BlendTree:
混合树用于相似动画的混合。例如可以对角色不同方向的跑动动画来进行混合。
1D混合:
只需要一个参数控制的混合,用户需要选择一个Parameter来控制。
- Blend Type:选择混合树类型。
- Parameter:选择使用的参数。
- Parameter下方的图形:
- 横轴:参数范围。
- 纵轴:动画权重。
- 红线:当前参数的值所在的位置。
- Motion:需要绑定的动画片段或者混合树。
- Automate Thresholds:是否使用自动阈值。
- Compute Thresholds:根据用户从动画剪辑中的根部动作获取的数据设置阈值。
2D混合:
参数由一个参数分为两个参数。
2D Simple Directional(2D简单定向模式):
该混合模式适用于所有动画都具有一定的运动方向或者其中任意两段动画的运动方向都不相同的情形。此模式下,每一个方向上都不应存在多段动画,例如向前跑和向前走不可同时存在。
2D Freeform Directional(2D自由定向模式):
该混合模式适用于所有动画都具有一定的运动方向,但在同一方向上可以存在多段动画,例如向前跑和向前走可以同时存在。
2D Freeform Cartesain(2D自由笛卡尔模式):
该混合模式适用于所有动画具有不一定的运动方向,例如向前走然后向右转。此模式下的参数可以代表不同含义,例如x和y可以分别代表角速度和线性速度。
直接混合:
通常使用一个动画一个参数的形式。
直接混合常用于动画表情的混合。
IK逆向运动学:
大多数的角色动画都是通过将骨骼动画的关节角度旋转到预定值来实现的。一个子关节的位置是由父节点的旋转角度决定的,这样,处于节点链末端的节点位置是由此链条上的各个节点的旋转角和相对位移来决定的。这种决定骨骼位置的方法称为前向运动学,而反过来由子节点位置决定父节点位置的方法就叫做逆向运动学。
实际开发中,IK的应用非常广泛,如角色头部跟随,在崎岖不平的表面角色脚部会根据地面高度而抬起,都是IK的应用。
IK可以使用脚本控制。下面为常用的控制方法: