Unity-黑暗之魂复刻-动画控制器

在Animator中有一个选项ApplyRootMotion我们取消勾选,这个选项将动画中根节点的移动量套用到物体的XYZ中。

一维混合树 1D Blend Tree

1.BlendType中我们常用1D与2D Freeform Directional
在1D中混合树只受一个Parameter的影响
2.Threshold(阈值)参数,这个参数将用来改变混合多个动画的比例。
3.时钟:来控制动画的播放速度
4.镜像:动画将以镜像的方式进行播放


BlendTree1D.PNG
BlendTree面板.PNG

将PI与AC module进行串接

创建一个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) );

再谈Rigidbody

在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)

你可能感兴趣的:(Unity-黑暗之魂复刻-动画控制器)