如何避免在Unity3d中检测到相同对象的第二次碰撞?

时间:2015-08-07 18:45:51

标签: c# unity3d collision

我正在制作一款老式的游戏" Lotus"游戏(玩家的车只在屏幕底部向左和向右移动,对手车出现在顶部,并且#34;追逐"但实际上只是朝向玩家的车辆向下移动)。 所以我在所有车上都有刚体,当玩家的车与其他车碰撞时,我想检测它但只有一次

我用:

void OnCollisionEnter (Collision collision)
{
    ContactPoint contactPoint = collision.contacts [0];

    GameObject cube = GameObject.CreatePrimitive (PrimitiveType.Cube);
    cube.transform.position = contactPoint.point;

}

使用此代码立方体创建1-5次,这意味着在同一对象上发生多次碰撞。我想要实现的是,在第一次碰撞后,不报告另一个(不应该创建此碰撞的立方体)但是当与另一个对手车发生碰撞时仍应创建一个立方体。 简而言之:每次碰撞对手车只有一个立方体。我打算用它来进行分数计算。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

我认为你应该创建一个bool变量。 private bool detectedCollision = false; 而且,当您首先检测到碰撞时,将此变量转为true 当你需要检测另一次碰撞时,只需将其转回false即可。我认为这是一种简单的方法。

void OnCollisionEnter (Collision collision)
{
if(!detectedCollision){
    ContactPoint contactPoint = collision.contacts [0];

    GameObject cube = GameObject.CreatePrimitive (PrimitiveType.Cube);
    cube.transform.position = contactPoint.point;
detectedCollision = true;
} 
}

答案 1 :(得分:0)

无论哪个级别保持得分,都要有一个碰撞的主列表,然后你可以这样做:

class CarCollision
{
    public string[] victims;

    public CarCollision(params string[] Victims)
    {
        victims = Victims;
    }
}

...

void OnCollisionEnter (Collision col)
{
    masterList.AddCollission(collision.contacts [0], this.name, col.gameObject.name);
}

void OnCollisionExit (Collision col)
{
    masterList.RemoveCollision(this.name, col.gameObject.name);
}

...

class ScoreClass
{
    private List<CarCollision> collisions = new List<CarCollision>();

    public void AddCollision(ContactPoint contactPoint, params string[] victims)
    {
        if(!collisions.Any(i => 
            i.victims.All(v => victims.Contains(v)))
        {
            collisions.Add(new CarCollision(victims));

            GameObject cube = GameObject.CreatePrimitive (PrimitiveType.Cube);
            cube.transform.position = contactPoint.point;
        }
    }

    public void RemoveCollision(params string[] victims)
    {
        collisions.RemoveAll(i => 
            i.victims.All(v => victims.Contains(v)));
    }
}