[魂类复刻学习日志]5.坠地动作设计

坠地动作设计

提要

  • 跳跃落地时,我们往往需要一个过渡的动画,即坠地(坠落)动画,这样就不会显得太突然,然而这又会引出许多问题,如何判断什么时候需要坠落,坠落时的速度方向变化又是怎样的,本节将解决这些问题

加入坠落动画

  • 将资源中的坠落动画加入Animator中,并且添加一些转变,我们设计的是跳跃动画播放完后缓慢地进行坠落,当然,有时候可能来不及播放fall动画就接触到地面了(这个等会再说),所以我们需要加入一个Bool型的变量isGround来表示Ybot是否接触了地面

  • 如图,在jump状态到ground状态的转变中,我们加入了条件isGround为true,同样,在fall状态到ground状态,也加入一样的条件

触发坠落动画

  • 又要再次用代码来触发动画了,这次也一样,isGround代表是否在地面,而如何检测这种状态,则需要利用之前给Ybot加的胶囊碰撞体(CapsuleCollider)了

  • 这一次在PlayerHandle中加入sensor的空对象,这是我们要用来检测并反馈状态的对象

  • 在sensor中加入相应的脚本组件,首先需要获取PlayerHandle中的碰撞体,公开并挂载一个CapsuleCollider对象,还需要在Awake()函数中获取到它的半径

  • 为了获取与胶囊组件碰撞的物体的相关信息,需要使用一个api:
    Physics.OverlapCapsule(),它需要四个参数,从胶囊的两个球体的中心点,半径,以及接收碰撞的层,这个层我们还需要额外把地面加入,因为我们只想要Ybot与地面碰撞的相关信息

  • 在此之前还需要计算两个球心点:

	point1 = transform.position + transform.up * (radius - offset);
	point2 = transform.position + transform.up * cacol.height - transform.up * (radius - offset);
 Collider[] outputCols = Physics.OverlapCapsule(point1, point2, radius,LayerMask.GetMask("Ground"));
  • 然后检测Collider数组,再次向父对象发送信息,调用函数:
        if(outputCols.Length != 0)
        {
            SendMessageUpwards("IsGround");
        }
        else
        {
            SendMessageUpwards("IsNotGround");
        }
  • 完善代码,传递状态(记得解锁输入)
    public void IsGround() 
    {
        anim.SetBool("isGround", true);
    }

    public void IsNotGround()
    {
        anim.SetBool("isGround", false);
    }

    public void OnGroundEnter()
    {
        pl.inputEnabled = true;
        lockPlanar = false;
    }

posted @ 2023-04-17 20:42  月牙同学  阅读(28)  评论(0)    收藏  举报