[魂类复刻学习日志]2.实现控制移动
细节提要
- Animator组件中的Apply Root Motion
Apply Root Motion让角色动画驱动角色运动,提高了动画的使用效率。如果我们的动画是原地跑的时候,不需要勾选,而如果动画包含了角色移动,我们可以勾选来提升使用效率 - 导入外部模型(带有人形动画)
当 Unity 导入包含人形骨架和动画的模型文件时,需要将模型的骨骼结构与其动画进行协调。为了实现这一点,系统会将文件中的每个骨骼映射到人形 Avatar,这样才能正确播放动画。
从 Inspector 窗口的 Rig 选项卡中,将 Animation Type 设置为 Humanoid。
- Rigidbody.constraints经常要冻结xyz轴的旋转
一维混合树
- 通过为Ybox添加Animator组件,并且添加一个混合树结点,我们先用一个变量(forward)来控制从静止到行走的转换,“混合”代表了两者不是突然的转变,因此我们可以发现forward从0到1时,我们会“慢慢”开始走动
通过向量来实现移动及转向
- 我们需要通过代码来改变forward的值,随后即可转换动画,但此时又涉及到了如何让角色转向行走,向量法就是关键
- 上一节的Dup和Dright即是我们在两个轴(z,x)的偏移量,我们要使用它们来得到一个位移的向量
Dmag = Mathf.Sqrt((Dup * Dup) + (Dright * Dright));//位移方向向量的模
Dvec = Dright * transform.right + Dup * transform.forward;//用对应方向的数值乘上对应x,z的方向向量,从而得到位移的方向
-
Dmag即是模(我们的输入组件获取到的输入是逐渐变化的),而且相当于是从原点开始做了一个半径为1的圆,恰好符合了刚刚混合树中参数的范围。Dvec即是位移向量,由Z轴方向(transform.forward)乘上Z轴方向移动偏移量(Dup),再加上(向量加法)X轴方向(transform.right)乘上X轴方向移动偏移量(Dright),即可得出
-
之后,我们先为Animtor组件设置参数,转变动画,参数即是刚刚的Dmag,而转向则是沿着位移向量,但是有一件事情需要注意:当我们停下输入的时候,由于是衰减,Dmag并不会马上归零,这样的话可能会发现停下输入Ybox居然慢慢转身,因此作出一个判断,当Dmag大于0.1时,才有转向。
-
movingVec类似于速度的向量,在FixedUpdate()中我们需要改变Ybox刚体的位置来使其进行真正的位移
private void Update()
{
anim.SetFloat("forward",pl.Dmag) ;
if(pl.Dmag > 0.1f)
{
model.transform.forward = pl.Dvec;//改变模型的朝向,朝向即为位移的方向
}
movingVec = pl.Dmag * moveSpeed * model.transform.forward ;
}
private void FixedUpdate()
{
rg.position += movingVec * Time.fixedDeltaTime;
//rg.velocity = movingVec; 这样做会出现BUG,因为movingVec的y轴为0
}