Answers:
Physics.IgnoreCollision和Physics.IgnoreLayerCollision允许您分别禁用两个碰撞器之间以及两个图层之间的碰撞。
如果要从碰撞中排除特定的对撞机,则没有内置的方法可以做到。如果您将非运动刚体与非触发对撞机配合使用,即使您尝试按标签过滤出响应,也始终会有响应。
我们在项目上完成此操作的方法是创建一个名为“ Void”的层。虚空根本不会与任何物体碰撞。
现在,您可以通过将碰撞器的图层设置为“ Void”来暂时禁用碰撞器,并通过恢复其旧图层来重新启用它。
这是要点:
int oldLayer = -1;
int voidLayer;
void Start()
{
voidLayer = LayerMask.NameToLayer("Void");
}
void DisableCollider(Collider col)
{
oldLayer = col.gameObject.layer;
col.gameObject.layer = voidLayer;
}
void EnableCollider(Collider col)
{
col.gameObject.layer = oldLayer;
}
我们之所以这样做,是因为在某些情况下启用和禁用刚体刚体的对撞机确实会搞砸事情。因此,您不能可靠地禁用复合刚体对撞机的一部分,但是可以可靠地在复合对撞机零件之一的层周围进行交换。
为了减少僵尸碰撞对汽车的影响,请考虑使僵尸的运动刚度触发器成为可能,或者使它们的质量非常小(例如float.Epsilon),因此对汽车的动量的影响为零。发生碰撞时,您也可以进行此层切换,这样即使第一个碰撞对车身施加的作用力微不足道,也不会触发后续碰撞。
您甚至可以将它们切换到不与汽车碰撞的图层。
您还可以在僵尸上放置另一个对撞机,并在冲撞时激活它。这样,您可以伪造冲击力OnTriggerEnter。您可能无法获得如此精确的结果,但是您可以估算出接触法线足以将僵尸扔到有趣的地方的地方。
您必须问自己:
我是否希望能够用我的车撞过去的僵尸,还是应该只播放死亡动画?
我是否在乎撞僵尸是否会以较小的方式影响汽车的速度和角速度?
当汽车开始加速时,在所有僵尸上调用Physics.IgnoreCollision,同时将播放器对象的函数传递给该对象。这将导致Unity对播放器和僵尸之间的任何碰撞均不做出反应。当汽车完成助推时,Physics.IgnoreCollision
再次呼叫每个僵尸,将玩家对象传递给它false
,并使碰撞响应重新开始。
我猜您可以检查对象的名称,或向对象类添加名称值,然后检查吗?
bool boosting = false; //need a trigger in the game to set this to true.
function OnCollisionEnter(theCollision : Collision)
{
if (boosting == true)
{
if(theCollision.gameObject.name == "Zombie")
{
Debug.Log("Zombie hit during boost");
}
else if(theCollision.gameObject.name == "Wall")
{
Debug.Log("Wall hit during boost");
}
}
else
{
if(theCollision.gameObject.name == "Zombie")
{
Debug.Log("Zombie hit not in boost");
}
else if(theCollision.gameObject.name == "Wall")
{
Debug.Log("Wall hit not in boost");
}
}
}
然后只有另一个变量,您可以使用它检查提升并将其添加到检查中。
编辑:添加此变量。