[魂类复刻学习日志]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
   }
posted @ 2023-04-09 17:22  月牙同学  阅读(20)  评论(0)    收藏  举报