在Animator中有一个选项ApplyRootMotion我们取消勾选,这个选项将动画中根节点的移动量套用到物体的XYZ中。
1.BlendType中我们常用1D与2D Freeform Directional 在1D中混合树只受一个Parameter的影响 2.Threshold(阈值)参数,这个参数将用来改变混合多个动画的比例。 3.时钟:来控制动画的播放速度 4.镜像:动画将以镜像的方式进行播放
BlendTree1D.PNG
BlendTree面板.PNG
创建一个ActorController类引用用户的输入类PlayerInput和引用动画的GameObject,将animator中的混合树的参数设置为用户输入的参数。
通过Input的值与当前角色的前后左右相乘来控制角色在场景中的朝向。将Dup和Dright的平方相加开根号作为移动的距离,方向将Dright与transform.right相乘加上Dup与transform.forward相乘得到移动的方向。这种方法存在一些问题,当同时按两个垂直方向的键位的时候,我们将得到根号2的结果,这不是我们像要的结果。
Dmag = Mathf.Sqrt(Dup * Dup + Dright *Dright);
Dvec = Dright * transform.right + Dup * transform.forward;
anim.SetFloat("forward", pi.Dmag);
//控制角色移动是控制将Input的前后左右控制角色当前的前后左右
model.transform.forward = pi.Dvec;
我们引用一篇Paper中的解法,这里给出截图
坐标轴转换.PNG
球形插值对角色的旋转进行平滑处理,使用球形插值
if(pi.Dmag > 0.1f)
{
//使用球形插值,每次插值将Vector3沿着球面进行移动,而不是穿过球体
model.transform.forward = Vector3.Slerp(model.transform.forward, pi.Dvec, 0.3f);
}
线性插值进行优化动画的Parameter的值,让角色的行走和跑步的转换更加平滑
float targetRunMulti = ((pi.run) ? 2.0f : 1.0f);
anim.SetFloat("forward",Mathf.Lerp(anim.GetFloat("forward"), pi.Dmag * targetRunMulti,0.2f) );
在Update中我们的刷新速度与程序有相关 在FixedUpdate中以固定的刷新速度进行刷新,物理引擎会根据这个进行刷新 我们通过Rigidbody控制角色移动的时候有两种方法: 1.在当前rigidbody的position上加一个新的vector3作为他的移动量 2.直接改变rigidbody的velocity(速度)这个参数,使用这种方法的时候要注意在存在斜坡的时候,velocity我们要注意y分量,如果直接将我们的Input的虚拟映射的速度给它会存在y分量为0的情况,所以我们要让velocity的y继续使用它原本的y。
//通过rigidbody的Position控制gameObj的Pos
//rigid.position += movingVec * Time.fixedDeltaTime * walkSpeed;
//使用velocity时会复写velocity中的y分量,将y分量设为0
rigid.velocity = new Vector3(movingVec.x,rigid.velocity.y,movingVec.z) * walkSpeed;
```![BlendTree1D.PNG](https://upload-images.jianshu.io/upload_images/11173460-918d7296f648832b.PNG?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)