[英]When using transform.Translate in Unity3D outside of an update loop, how can I perform collision detection?
[英]How can I avoid detection of second collision of same objects in Unity3d?
我正在按照旧的“莲花”游戏风格制作游戏(玩家的赛车仅在屏幕底部左右移动,对手的赛车出现在顶部并被“追赶”,但实际上只是向下移动到玩家的赛车)。 因此,我在所有汽车上都有刚体,当玩家的汽车与其他汽车发生碰撞时,我只想检测一次 。
我用:
void OnCollisionEnter (Collision collision)
{
ContactPoint contactPoint = collision.contacts [0];
GameObject cube = GameObject.CreatePrimitive (PrimitiveType.Cube);
cube.transform.position = contactPoint.point;
}
使用此代码立方体将被创建1-5次,这意味着在同一对象上发生多次碰撞。 我要实现的是,第一次碰撞后没有报告另一个碰撞(不应创建用于该碰撞的多维数据集),但是当与另一辆对手汽车发生碰撞时仍应创建一个多维数据集。 简而言之:与对手汽车的每次碰撞只有一个立方体。 我打算将其用于某种分数计算。
有任何想法吗?
我认为您应该创建一个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;
}
}
无论哪个班保持得分,都有一个碰撞主列表,您将在该列表中进行以下操作:
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)));
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.