在Inspector下
Animator的第一项为状态机的名称(注意:这里的名称不是动画名称)
Tag 当前动画的Tag标签,可以通过Tag值来处理一些逻辑
Motion:动画片段的名称
Speed:动画的播放速度:1表示正常播放,
speed >1 表示加速 0< speed<1,表示减速
speed < 0 表示倒放
动画的speed一般是不可更改的,如果需要更改需要勾选下方Parameter
Multiplier 会被激活,此时动画的速度会是与multiplier变量的乘积 是float变量
Motion Time :表示播放动画片段的特定时间点 0~1 0代表动画片段的开始,1表示结束,也是需要关联一个float变量 比如0.5 表示从动画的中间播放 (和Cycle Offset有一定区别)
Mirror:表示将动画镜像(只对人形动画管用),需要关联一个bool类型的变量
Cycle Offset :动画偏移,范围是0~1 需要关联一个float变量 值为0.5f 表示从动画的中间播放,(只是更改了一下播放的位置,并不是分割,播放的动画还是完整的)
Foot IK: :IK的动画矫正机制
这个属性需要特殊说明一下,在我们使用了Avatar替身系统之后,我们角色的骨骼会出现一些手和脚偏移的情况,unity 为了保证骨骼的正确性,提前骨骼系统下正确的手脚位置记录下来,放在了4个IK Goal上,如下图所示,手部和脚部红色的球,unity认为使用原来的骨骼系统时,角色的手应该放在这个位置, 手肘处是IK Hint 可以通过它来防止肘部关节在运动时出现的一些奇怪的扭曲,
Foot IK的作用就是把我们脚部的实际位置向这里的IK Goal的位置拉近一点,只是略微调整手脚动画的位置,它可以一定程度上改善手脚部动画的不自然,但不一定能满足高质量的动画需求
为了使用IK ,在动画层级这里需要勾选IK Pass,这样我们就可以在脚本里调用相关的IK方法了。
//IK goal的权重范围是0~1 数值越大 脚部的位置越靠近IK goal
[Range(0,1)] public float weight = 0;
private void OnAnimatorIK(int layerIndex)
{
//设置右脚的值为零点位置
animator.SetIKPosition(AvatarIKGoal.RightFoot, Vector3.zero);
//设置右脚的权重
animator.SetIKPositionWeight(AvatarIKGoal.RightFoot, weight);
}
如果加上一些射线检测 我们可以根据它开发出脚步适应地形的效果
Write Defaults:写入默认值,unity官方API解释为 AnimatorStates 是否为其运动执行未动画化的属性写入默认值 (???看不懂,跟没说一样???)
在查了一些资料后,这里解释一下unity 的生命周期OnEnable 在运行开始时,unity会执行一次OnEnable 此时unity会遍历角色对象下所有的脚本,以及animator里所有的动画片段 ,我们知道AnimationClip(动画片段)是描述了物体的位移、旋转以及缩放属性(当然 动画也可以描述物体的材质变化 以及脚本属性) 这里举个例子,比如我们做一个简单的开门关门动画,在开始运行时,unity 会遍历OpenDoor和CloseDoor的动画属性,如果更改了某些参数,就把这个参数记录下来,未更改的参数写入默认值,有兴趣的小伙伴参考一下这篇文章,写的很详细
[Unity] AnimatorStates中的write defaults详解_Rickshao1993的博客-CSDN博客
这里在额外说一下一些脚本API
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour
{
public Animator animator;
public AnimatorStateInfo currentStateInfo;
// Start is called before the first frame update
void Start()
{
animator = character.GetComponent<Animator>();
//通过层索引值获取当前状态机的动画状态
currentStateInfo = animator.GetCurrentAnimatorStateInfo(0);
//通过层名称获取当前状态机的动画状态
currentStateInfo = animator.GetCurrentAnimatorStateInfo(animator.GetLayerIndex("Base Layer"));
}
void Update()
{
}
}
AnimatorStateInfo动画状态信息,可以根据索引值和名字来获取当前层播放的动画,当然这里只是演示,正确的用法应放在Update() 里实时检测当前的动画