我正在制作一款老式的游戏" Lotus"游戏(玩家的车只在屏幕底部向左和向右移动,对手车出现在顶部,并且#34;追逐"但实际上只是朝向玩家的车辆向下移动)。 所以我在所有车上都有刚体,当玩家的车与其他车碰撞时,我想检测它但只有一次。
我用:
void OnCollisionEnter (Collision collision)
{
ContactPoint contactPoint = collision.contacts [0];
GameObject cube = GameObject.CreatePrimitive (PrimitiveType.Cube);
cube.transform.position = contactPoint.point;
}
使用此代码立方体创建1-5次,这意味着在同一对象上发生多次碰撞。我想要实现的是,在第一次碰撞后,不报告另一个(不应该创建此碰撞的立方体)但是当与另一个对手车发生碰撞时仍应创建一个立方体。 简而言之:每次碰撞对手车只有一个立方体。我打算用它来进行分数计算。
有什么想法吗?
答案 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)));
}
}