一、创建动画
1.选中要添加动画的游戏对象
2.Window—>Animation->Animation
会生成两个文件一个是
.anim文件即动画文件
.controller动画控制器文件
(选中状态机 ,点击Window->Animation->Animator,即可进入状态机编辑,如下图)
二、认识Animation编辑面板
三、使用动画控制物体移动
1.在Animation编辑界面中点击Add Property
2.选择Position
3.添加需要修改的数据(图中的白线在哪,就表示你在那个帧修改数据,如果该帧没有Key则会自动添加一个Key)
(图中有误 不是秒的意思是帧的意思)
四、创建2D游戏中的精灵动画
方法一:直接将两张Sprite图片一起拉到Hierarchy
方法二:给对象添加Animator组件,在建立一个AnimationController(简称AC),然后将AC拖入Animator组件中的Controller中,打开Animation面板直接将Sprite拖入面板设置Key即可。
五、模型的三种动画导入设置
- Legacy:比较古老的动画使用这个模式,该模式不支持Animator,使用的是Animation。
- Generic:人形与非人形动画都可以使用的设置,支持Animator,不支持Animation。
- Humanoid:仅人形动画使用,支持Animator,不支持Animation。如果是使用同一套骨骼的多个人形角色,则他们的动画是可以通用的。
六、动画切割
LoopTime:动画是否循环播放
LoopPose:循环播放时是动画更加平滑
CycleOffset:从原定的开始时间向后偏移多少秒,在开始播放动画
BakeIntoPose保持位置不受影响
七、StringToHash方法
将一个参数字符串转换成ID
private int SpeedID=Animator.StringToHash("Speed");
//这样在使用speed这个字符串参数的地方全部可以通过SpeedID代替,防止字符串写错从而不运行程序又不报错
八、1D混合树BlendTree
混合树有1D和2D。站立、跑动、这类只有速度差别的动画时,一般选用1D。
Velocity X按照x轴的速度来控制
以上三个动画只需要设置speed的值就可以控制动画的切换
anim.SetFloat("Speed",Input.GetAxisRaw("Vertical")*4.1f);//乘上4.1f是因为input接受的范围是-1到1。而我们根据图中可以看到speed的取值范围应该在0-4.1左右。因此要乘上4.1
九、2D混合树
2D混合树的几种类型:
- 2D Simple Directional:此类型需要保证混合的动画运动方向都不相同
- 2D Freeform Directional:允许在某个运动方向上有多个动画,但要保证有一个动画在原点播放(例如:Idle动画)
- 2D Freeform Castesian:最好适用于动画的运动都处于同一方向,仅仅只有视野的转换(人物头的移动)。
(在使用2D混合树控制角色的转向和奔跑动作时,当Compute Positions选择为Velocity XZ时,角色的转向动作不明显
解决:这是可能是因为角色转向动画本身是通过Rotation来控制转向,对于xz轴的速度很小因此在Velocityxz模式中转向不明显,需要将ComputePositions调整为X position From->Angular Speed(Deg)即根据角度来控制转向)
十、Match Target
作用:当我们希望人物的动画能够贴紧某个位置的时候使用
public void MatchTarget (Vector3 matchPosition, Quaternion matchRotation, AvatarTarget targetBodyPart, MatchTargetWeightMask weightMask, float startNormalizedTime, float targetNormalizedTime= 1);
//按照顺序参数含义依次为:身体某个部位需要到达的位置,我们希望身体部位进行的旋转,用来作为匹配的身体部位,包含匹配位置和旋转的权重的结构,从动画的某个时刻开始,到动画的某个时刻结束
//例子
anim.MatchTarget(matchTarget,Quaternion.identity,AvatarTarget.LeftHand,new MatchTargetWeightMask(Vector3.one,0),0.32f,0.4f);
//以左手作为匹配点,动画从0.32f开始播放到0.4f结束,左手到达matchTarget的位置,自身不旋转
十一、角色控制器
适用于类人角色,添加上角色控制器后,会自动添加一个胶囊碰撞体。
参数说明:
- Slope Limt:坡度限制,代表该角色最多能爬上多陡的坡度
- Step Offset:台阶高度,代表该角色最多能迈上的台阶高度。
- Skin Width:皮肤厚度,决定了两个碰撞体可以相互渗入的深度,值过大导致抖动,过小导致卡住,一般为Radius的10%
- Min Move Distance:最小移动距离,大多数情况下设置为0(如果角色的最小移动距离小于该数值,则角色不会移动,避免抖动)
- Center:决定了胶囊碰撞体在世界坐标中的位置
- Radius:半径,胶囊碰撞体的长度半径,同时也决定了碰撞体的宽度。
- Height:胶囊碰撞体的高度。
十二、Animotar具有多层Layer时
多层动画相互影响的类型有:
- Override:重写
- Additive:附加
(一)、Override
当有多层Layer时,如果选择的重写模式,那么动画会根据每层的比重来渲染。
例子,假设BaseLayer控制角色的移动,HoldLog控制角色的抬手动作。
(当Hold Log比重为0时候角色不抬手,正常的奔跑走路跳跃,如下图)
当比重上升时,HoldLog层的抬手动作逐渐显现,角色的移动速度变慢
(当HoldLog层重写比例为1时,BaseLayer层所有功能失效,角色不在移动,只显示抬手动作,如下图)
这两层动画一层为脚步,一层为手部,那么如何在Override模式下使得两层动画互不影响都显示出来呢?
——使用AvatarMask
(红色的部位将不会被重写)
十三、使用IK动画设置左手到目标位置
需要将类人角色的左右手定位到某个游戏物体的边缘(形成手持的状态)
1.首先需要获取到游戏物体左右边缘的点的位置(通过设置两个空物体通过空物体定位)
2.在手持游戏物体的这个动画层上勾选上IKpass
3.调用内置函数OnAnimatorIK
private void OnAnimatorIK(int layerIndex) {
int weight=anim.GetBool("isHoldLog")?1:0;
//设置权重参数,根据是否举起物体参数设置为0或1;
anim.SetIKPosition(AvatarIKGoal.LeftHand,leftHand.position);
//设置左手的位置参数和leftHand的位置相同
anim.SetIKRotation(AvatarIKGoal.LeftHand,leftHand.rotation);
//设置左手的旋转参数和leftHand的位置相同;
anim.SetIKPositionWeight(AvatarIKGoal.LeftHand,weight);
//设置左手的位置参数的权重,权重越大越靠近设置的位置;
anim.SetIKRotationWeight(AvatarIKGoal.LeftHand,weight);
//设置左手的旋转参数的权重,权重越大越靠近设置的位置;
}