unity-解决人物从上面碰撞(正常落地碰撞)和从侧面碰撞地形的问题

基础设置

今天在做一个人物的跳跃,我给人物添加了一个2d刚体capsule collider2d
给地形添加了box collider2d,下面红色矩形和白色圆圈是collider
unity-解决人物从上面碰撞(正常落地碰撞)和从侧面碰撞地形的问题_第1张图片

跳跃功能

问题和跳跃有些关系,说明下我跳跃功能是怎么弄的。
我用addForce的方法给刚体一个向上的冲击力,使得人物跳跃起来。
为了让它在跳跃的时候不会做出idle和跑步的动画,我设置了一个isJumping变量,当按下J键让人物跳起来时,设置isJumping为true。
然后,在其他动画的播放条件里面添加isJumping==false就可以了。

问题

我既然在跳起的时候把isJumping设为true,那么就要在落地的时候把他设置为false,否则会播放不了其他动画。
我用了OnTriggerEnter2D的方法,把地形的标签设置为ground。

private void OnTriggerEnter2D(Collider2D collider2D)
    { 
        if (collider2D.tag == "ground")
        {
        isJumping=false;
          ...........
        }
    }
    

图中红色部分都能被检测到。
如果人物跳跃后从上面撞到地形,图中下面的地形。那么isJumping能被设置为false。
但是人物跳跃到空中从侧面撞过去也能被检测到,就是图中右边那个悬浮的地形,这样的话我人物还在空中,只要按下移动键,从侧面撞到地形,就可以在空中做出跑步和idle动作。
这样就导致了无法区分上面和侧面的碰撞。

解决办法

我想到的办法是给人物添加一个子物体,并给子物体添加collider,并置于人物的脚底,还要很小,但是不能太小,最小会检测不到。
unity-解决人物从上面碰撞(正常落地碰撞)和从侧面碰撞地形的问题_第2张图片
在这里插入图片描述
两脚中间那个小圆圈就是带collider的子物体。
所以人物没有碰撞检测的脚本,碰撞检测的脚本在子物体上面。
当人物在空中向右撞向地形的时候,人物的collider会碰到地形,但是子物体的collider不会,因为子物体的collider太小了且人物的collider挡住了地形。
但是如果人物从上面撞地形,就是正常落地,显然子物体的位置能够碰到地形,从而被检测到。
这个方法一开始碰到了很多问题。
但是最终还是解决了。

概括

1.首先人物添加collider–纯粹的挡住地形,并添加刚体
2.然后给他添加子物体,并给子物体添加collider(并且—不要给子物体添加刚体。否则,如果人物受重力或者是碰撞而发生位移,那么子物体将不会跟着动。)
3.子物体的位置要在人物脚底,并且要小
3.我地面只添加了collider,但是子物体没有刚体也能检测到与地面的碰撞,因为父物体也就是人物带了刚体。(地面也可以添加刚体,这样人物就不用刚体)

你可能感兴趣的:(unity)