Physics.IgnoreCollision什么都不做

时间:2016-07-26 19:20:07

标签: c# unity3d collision-detection

我试图制作一部BTD游戏。由于不同的气球(敌人)具有不同的速度,因此当他们在路径上行进时它们会相互碰撞。我目前正在使用此代码:

void OnCollisionEnter (Collision coll)
{
    if (coll.gameObject.tag == "Enemy")
    {
        Physics.IgnoreCollision(coll.collider, gameObject.GetComponent<SphereCollider>());

    }
}

然而,它似乎根本不起作用。敌人仍然相互碰撞。另一方面,与塔的敌人和子弹的碰撞正在发挥作用。

void OnTriggerEnter (Collider col)
{
    if (col.tag == "Bullet")
    {
        CurrentHP -= col.GetComponent<TackShooterBullet>().Damage;
    }  

我已经尝试了图层碰撞(同一层中的敌人和未检查图层碰撞矩阵中的同一层碰撞,但这也不起作用。敌人包含一个球体网格滤镜,球体对撞机,网格渲染器,刚体,材料和2个脚本。有没有更好的方法来避免敌人之间的碰撞。我问这个问题,因为我看过重复,但他们的解决方案不是我需要提供更多代码。

编辑清晰度:再次,我想要完成的是让敌人能够相互通过。

编辑(修正问题):我发现要避免敌人碰撞,我也可以删除刚体。然而,移除ridigbody将搞乱子弹 - &gt;敌人的敌人触发器。因此,我刚写了一下子弹与子弹之间的碰撞。而不是子弹类中的敌人。

using UnityEngine;

public class TackShooterBullet : MonoBehaviour {

private GameObject target;
public float Damage;

// Use this for initialization
void Start () {
    target = transform.parent.GetComponent<TackShooterRange>().Target; // Target = Enemy[0] (First Enemy To Enter Range - Enemy is Removed from JList when exiting Range)
}

// Update is called once per frame
void Update()
{

    Damage = gameObject.transform.parent.transform.parent.GetComponent<TackShooterLimitingRange1>().level * 20; // Upgrade Level * 20 = Damage Done

    if (target == null) // If Enemy Exits Range
    {
        Destroy(gameObject); // Destroy Bullet
    }
    if (target != null) // Enemy Exists In Range
    {
        transform.position = Vector3.MoveTowards(transform.position, target.transform.position, 20 * Time.deltaTime); // Bullet Follows Enemy
        Destroy(gameObject); // Destroy Bullet Upon Contact With Enemy
        target.GetComponent<HealthOfEnemy>().CurrentHP -= Damage; // Enemy Loses Health
    }
}

这允许我删除OnTriggerEnter&amp; OnCollisionEnter方法以及前面所述的Enemy Class中的RigidBody,因此这些属性不再影响敌人之间的碰撞。

1 个答案:

答案 0 :(得分:0)

Unity具有内置的功能,可以更轻松地进行冲突检测,称为基于图层的冲突检测:

https://docs.unity3d.com/Manual/LayerBasedCollision.html

文档非常好。如果需要进一步说明,请发表评论。