一、动画图层
概述:动画图层允许你组织和混合多个动画,使其在不同的层级中进行独立控制。
Animator Controller中可以包含多个动画图层,每个图层可以独立控制一组动画。
每个动画图层都有一个权重,用于控制该层对最终混合的动画产生的影响程度。
1.三个默认状态:
Entry(进入状态):
作用:Entry是状态机中的默认起始状态,表示进入状态机时的初始状态。
用途:在Entry状态中可以定义一些进入状态机时需要执行的初始化逻辑,例如设置初始参数或播放初始动画。
注意事项:只能有一个Entry状态,状态机进入时会自动转换到该状态。
Any State(任意状态):
作用:Any State是一个特殊的状态,它可以作为过渡条件的来源状态。任何从AnyState发起的过渡都不需要特定的条件,可以在任何时候触发。
用途:主要用于实现一些在任何状态下都需要执行的逻辑,例如全局的输入检测或通用的过渡。
注意事项:在从Any State发起的过渡中,不需要指定具体的条件,它会在任何状态下都触发。
Exit(退出状态):
作用:Exit是状态机中的默认结束状态,表示退出状态机时的状态。
用途:在Exit状态中可以定义一些退出状态机时需要执行的清理逻辑,例如保存状态、停止动画等
注意事项:只能有一个Exit状态,状态机退出时会自动转换到该状态。
2.子状态机
在动画器中可以创建子状态机,可以将类型相同的动画发在一个状态机中,子状态机之前可以相互过渡
3.权重
每个动画图层都有一个权重属性,该属性控制层对最终混合的动画的影响程度。通过脚本或动画状态机中的参数可以调整权重。
示例说明:现在新创建一个图层,为其添加一个手臂挥舞的动画,在旧的图层里面有一个站立的动画。由于新建的图层权重为0,当运行游戏时会只播放旧层的动画。
当把新的图层的权重调节到0.5时,当运行游戏时这两个动画都不会播放完整。
当把新图层的权重调节到1.0时,运行游戏时会完全覆盖旧的动画。
4.遮罩
图层遮罩可以更加精细地控制角色或对象的动画行为,使得在不同的图层上可以有不同的动画效果。比如a图层的中有跑步动画,b图层中挥手动画,现在希望挥手只是作为手臂上的挥手用b图层控制,而跑步动画作用于身体其他地方用a图层控制,要做到这个效果就得使用图层遮罩。
示例:
在项目目录下创建一个骨骼遮罩Avatar,其中绿色表示做动画的区域,默认是所有区域都做动画,点击绿色区域会切换为红色,红色表示该区域不做动画。
为了达到要求只需要将手臂设置为绿色,意思是只做手臂上的动画
使用方式,将这个创建的遮罩文件拖拽到对应图层设置中的遮罩区域。
这样当游戏运行时,手臂上会执行挥手的动画,其他部位执行跑步的动画,效果是一边跑步一边挥手。
二、反向动力学
在Unity中,反向动力学(Inverse Kinematics,简称IK)是一种计算手段,用于逆向求解骨骼系统中末端效应器(End Effector)的位置,以实现更自然、更符合预期的角色动画。反向动力学通常用于处理角色的手、脚、头部等部位的动作,以便它们能够正确地跟随目标位置。
示例说明:想让玩家头部一直看向某一个物体。
想要使用这个反向动力学,就必须在对应的图层中打开IK处理
在线场景中有一个球体,在人物的脚本里面获取这个球体
public Transform Sphere;
然后使用 OnAnimatorIK (int layerIndex)方法,当要使用IK事件,就要把其相关的写在这个方法里。
private void OnAnimatorIK(int layerIndex)
{
//设置头部
animator.SetLookAtWeight(1);
animator.SetLookAtPosition(Sphere.position);
}
运行游戏后,无论人物如和移动,头部都会看向球体,直到无法看见