[魂类复刻学习日志]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;
}