Unity动画系统,也称为Mecanim系统,可以操作模型的各种动画
——Scale Factor:缩放系数(因为不同的建模软件使用的单位不同,Unity中默认游戏世界的一个单位等于一米)
——Mesh Compression:网络压缩选项,压缩值越大网格体的文件越小,但有可能导致网格出现错误,要依据实际情况进行选择
——Read/Write Enabled:读/写启用,如果要对模型的网格进行操作必须开启此选项
——Animation Type:动画类型
None:不使用动画
Legacy:旧版本的动画类型,只能用Animation播放动画
Generic:非人形,例如四足动物,只能使用Animator播放动画
Humanoid:人形,只能使用Animator播放动画并且必须在Animator组件上指定Avatar
——Avatar Definition:骨骼设置
Create From This Model:为当前模型创建自身的Avatar骨骼
Copy From Other Avatar:使用其他Avatar骨骼映射到此模型身上
——Optimize Game Objects:勾选后会使模型子节点更简单,隐藏骨骼节点只显示渲染节点
——Import Animation:是否导入模型自带的动画,只有在Animation Type为Generic和Humanoid类型下才可以导入动画,Humanoid类型下可以对动画进行更深度的设置
——Loop Time:动画循环播放
——loop match:动画的第一帧和最后一帧的匹配程度
——Bake Into Pose:首先介绍一下Unity中的两种Tranform变换:Body Transform和Root Transform,它们都是针对于有位移的动画,Body Transform是指模型动画本身的位移或角度变化不会作用到Transform组件上,Root Transform是指模型动画本身位移或角度的变化同时也会作用到Transform组件上,Body Transform和Root Transform是通过模型设置中的Bake Into Pose和Animator组件上的Apply Root Motion共同控制的
Bake Into Pose勾选,Apply Root Motion不勾选,表示Bake Into Pose
Bake Into Pose不勾选,Apply Root Motion勾选,表示Apply Root Motion
Bake Into Pose勾选,Apply Root Motion勾选,表示Bake Into Pose
Bake Into Pose不勾选,Apply Root Motion不勾选,表示Apply Root Motion
可以通过在OnAnimatorMove控制行为逻辑,这样Animator组件上的Apply Root Motion就变成了Handled By Script
using UnityEngine; public class Test : MonoBehaviour { public Animator ani; private bool m_RootMotion; private void OnAnimatorMove() { if (ani.GetCurrentAnimatorStateInfo(0).IsTag("RootMotion")) { m_RootMotion = true; transform.position += ani.deltaPosition; transform.rotation *= ani.deltaRotation; } else { m_RootMotion = false; } } }
——Based Upon:基于哪个点播放动画
——Offset:如果动画制作的有问题,可以调整模型播放动画的偏移点
——Events:动画事件,可以在动画的指定时间点添加方法事件
动画重定向意味着你可以将一组动画应用到各种各样的人形角色模型上,注意动画重定向只能用于Humanoid类型
想象以下如果一个RPG游戏里有100种怪物,每一种怪物的行走,攻击动画都差不多,如果没有动画重定向技术的话美术需要为每一种怪物制作大致相同的动画,即增加了美术的工作量又增加包体大小
将动画类型设置为Humaniod并且生成模型对应的Avatar,之后两个模型就可以使用同一套Animator了
——1D:适用于所有动画只有一个方向的变化,例如站立、走、跑三种动作的混合
——2D Simple Directional:适用于所有动画都具有一定的运动方向,其中任何两段动画的方向都不相同,例如向前走,向后走,向左走,向右走
——2D Freeform Directional:适用于所有动画都具有一定的运动方向,但是同一方向上可以存在多段动画,例如向前走和向前跑可以同时存在,注意此模型下必须有一个idle动画,也就是处于(0,0)原点位置的
——2D Freeform Cartesian:适用于所有动画都处于同一运动方向,两个Parament代表不同的含义,如角速度线速度,他可以用于类似向前跑,但头朝向左右(只是朝向,并没有向左右运动)
MatchTarget可以将角色的手或脚在特定时间放在特定的位置,使动作与游戏物体更加贴合,例如翻墙、跳跃、攀爬等,想要达到最佳效果主要就是调整最后的两个参数:开始和结束匹配的时间点。
计算将要匹配的位置和旋转角度,调用MatchTarget方法
注意
——MatchTarget只能用在BaseLayer层的动画
——需要勾选Animator中的Apply Root Motion
- void Jump()
- {
- if (ani.IsInTransition(0))
- {
- return;
- }
-
- if (ani.GetCurrentAnimatorStateInfo(0).IsName("jump"))
- {
- Debug.Log(ani.isMatchingTarget);
- ani.MatchTarget(matchPos, Quaternion.identity, AvatarTarget.LeftHand, new MatchTargetWeightMask(Vector3.one, 0), 0.5f, 0.7f);
- }
- }
与MatchTarget实现的效果类似,但是可以用在任意层的动画上
IK全称反向运动学,也就是根据子节点的位置推算出父节点的关节变化,而根据父节点的位置推算出子节点的关节变化称作正向运动学
使用IK动画首先动画类型必须是Humanoid类型并在Animator窗口设置中打开IK Pass
- public Transform trans1;
- public Transform trans2;
- private void OnAnimatorIK(int layerIndex)
- {
- if (ani.GetCurrentAnimatorStateInfo(1).IsName("AniName"))
- {
- ani.SetIKPosition(AvatarIKGoal.RightHand, trans1.position);
- ani.SetIKPositionWeight(AvatarIKGoal.RightHand, 1);
- ani.SetIKPosition(AvatarIKGoal.LeftHand, trans2.position);
- ani.SetIKPositionWeight(AvatarIKGoal.LeftHand, 1);
- }
- }
Avatar Mask可以实现两种动画的融合。例如人物有两个动画,走路和挥手,走路动画包括上半身动作和下半身动作,挥手动作只有上半身的挥手动作下半身没有动作,如果想要实现下半身播放走路动画的同时上半身播放挥手动画,可以使用Avatar Mask去实现
动画类型必须是Humanoid类型
——创建Avatar Mask并设置可以控制的部位
红色表示不播放此部位的动作,绿色表示播放此部位的动作
——设置状态机层级参数
新建一个状态机层,设置Avatar Mask并将权重设置为1
Blending一般情况下选择Override覆盖模式,Additive叠加模式仅适用于每个层控制单独部位的动画