Session20:趴下效果Crouch
这节课我们来为主角添加趴下的效果
添加新的Button
打开Project Setting -> Input Manager,我们发现Unity并没有内置的下蹲按键,所以我们需要添加一个,可以选中Jump,右键点击Duplicate,复制一个Input按键出来,改名为Crouch,并更改按键。
![image-20211104155142145](https://image-ym.oss-cn-guangzhou.aliyuncs.com/img/image-20211104155142145.png)
我们可以使用这种方法添加任意自己想要的按键效果。
添加下蹲效果
然后就可以为角色添加动画和代码了,动画部分略过,代码如下
void Crouch()
{
if(Input.GetButtonDown("Crouch"))
{
animator.SetBool("crouching", true);
}else if(Input.GetButtonUp("Crouch"))
{
animator.SetBool("crouching", false);
}
}
解决bug
添加动画和代码之后,我们的角色可以下蹲了,但仍然无法穿过这样的物体:
![image-20211104160852014](https://image-ym.oss-cn-guangzhou.aliyuncs.com/img/image-20211104160852014.png)
这是因为角色的碰撞体没有改变,这里我们采用的解决方法是当角色下蹲时取消头顶的方形collider
代码中添加:
public Collider2D Discoll;
void Crouch()
{
if(Input.GetButtonDown("Crouch"))
{
//按键按下
animator.SetBool("crouching", true);
Discoll.enabled = false;
}else if(Input.GetButtonUp("Crouch"))
{
//按键抬起
animator.SetBool("crouching", false);
Discoll.enabled = true;
}
}
回到Unity,将box collider拖过去,这样就可以穿过去了,但这样还有个问题,就是如果在中间取消下蹲,人物回到idle之后会卡住
![image-20211104161732643](https://image-ym.oss-cn-guangzhou.aliyuncs.com/img/image-20211104161732643.png)
所以我们需要更改一下代码逻辑:当角色头顶没有属于Ground图层的物体时才可以回到idle。
//检测用的
private bool checkHead = false;
private void Crouch()
{
if (Input.GetButtonDown("Crouch"))
{
animator.SetBool("crouching", true);
//关闭box collider
Discoll.enabled = false;
}
else if (Input.GetButtonUp("Crouch"))
{
//开启检测
checkHead = true;
}
//检测头部是否有ground
if(checkHead)
{
//overlap是重叠的意思,这个函数的作用是检查是否有碰撞体进入了指定的圆形区域
//当角色头顶没有ground的碰撞体时才可以恢复idle状态
if (!Physics2D.OverlapCircle(ceilingCheck.position, 0.2f, ground))
{
animator.SetBool("crouching", false);
Discoll.enabled = true;
//关闭检测
checkHead = false;
}
}
}
当松下下蹲的按键时,会开启检测,检测内容就是头顶有没有ground,没有的话就可以站起来回到idle。
这里还有个bug,就是人物在idle状态时同时按下下蹲按键,会直接以run的状态穿过上面的那种物体。原因是只要我们按下下蹲按键crouching就变为true,并把头部的碰撞体关闭,而我们从idle过渡到run也是一瞬间的事情,所以实际上是角色先进入了run,再进入的crouch,而run没有到crouch的过渡,角色就会以run的状态穿过物体,而且此时碰撞体是关闭的,可以正常通过。
解决方法就是添加run->crouch的过渡。