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