C# 检查物体是否未与任何物体碰撞

C# 检查物体是否未与任何物体碰撞,c#,unity3d,C#,Unity3d,有没有一种方法可以检测带有刚体对象的播放器上的碰撞器是否与2D环境中的任何其他碰撞器没有碰撞?/edit-实际上piojo的计数器更好,只需使用int而不是bool。 一种方法是在脚本中添加一个名为collisions的int,并将其设置为0。然后,如果碰撞器在任何一点触发OnCollisionCenter,只需增加它,并在OnCollisionExit中减少它。 类似的内容应该适用于3D: public int collisions = 0; void OnCollisionEnter(Co

有没有一种方法可以检测带有刚体对象的播放器上的碰撞器是否与2D环境中的任何其他碰撞器没有碰撞?

/edit-实际上piojo的计数器更好,只需使用int而不是bool。 一种方法是在脚本中添加一个名为collisions的int,并将其设置为0。然后,如果碰撞器在任何一点触发OnCollisionCenter,只需增加它,并在OnCollisionExit中减少它。 类似的内容应该适用于3D:

public int collisions = 0;

void OnCollisionEnter(Collision collision)
{
    collisions++;
}

void OnCollisionExit(Collision collision)
{
    collisions--;
}

不是从本质上说,但是有两种方法可以获得信息。最简单的方法是保留一个int计数器,并在OnCollisionCenter中递增,在OnCollisionExit中递减。计数器为0时,不存在冲突


另一种方法是使用物理函数,它可以告诉你哪些对撞机是重叠的,但如果它们是接触的,则不一定是重叠的。请注意您有哪种类型的碰撞器球体、胶囊、盒子。知道对撞机的大小/形状/位置后,可以调用Physics.overlappbox、Physics.overlappcapsule或Physics.overlapphere。赋予函数与碰撞器相同的形状,它将返回与该空间重叠的碰撞器。对于2D碰撞器,可以使用Physics2D.Overlap*函数。

我不明白为什么要保留所有数字。我只是在我的角色从边缘跳下或摔下时这样做,效果非常好

我的玩家和地形都有对撞机。我用地面标记标记了我的地形。 然后检查我目前是否与OnCollisionStay的对撞机保持联系


3D还是2D对撞机?你至少应该把你试过的东西放在你的问题里。另外还要添加语言标签。正如我在回答中提到的,不能使用bool。你需要一个整数计数器,否则一旦你碰到两个障碍物,它就会失败。这不是一个边缘的情况,因为你总是与地面碰撞。是的,我也尝试过这个,但使用了布尔值,所以它失败了,就像piojo说的。我认为使用计数器会很好。谢谢,这很有帮助。。谢谢piojo@sristy_poka不客气!我在我的项目中做了完全相同的事情,总是知道球员是否在地面上。这样更好吗?
void OnCollisionStay(Collision collision)
{
    if (collision.collider.tag == "Ground")
    {
        if(animator.GetBool("falling") == true)
        {
            //If I am colliding with the Ground, and if falling is set to true
            //set falling to false.
            //In my Animator, I have a transition back to walking when falling = false.
            animator.SetBool("falling", false);
            falling = false;
        }
    }
}

void OnCollisionExit(Collision collision)
{
    if (collision.collider.tag == "Ground")
    {
        //If I exit the Ground Collider, set falling to True.
        //In my animator, I have a transition that changes the animation 
        //to Falling if falling is true.
        animator.SetBool("falling", true);
        falling = true;
    }
}

void OnCollisionEnter(Collision collision)
{
    if (collision.collider.tag == "Obstacle")
        {
             //If I collide with a wall, I want to fall backwards.
             //In my animator controller, if ranIntoWall = true it plays a fall-
             //backwards animation and has an exit time.
            animator.SetBool("ranIntoWall", true);
            falling = true;
            //All player movement is inside of an if(!falling){} block
        }
}