Jump to content
Unity Insider Forum

Physics.IgnoreCollision wird Ignoriert...


Singular

Recommended Posts

Zur Abwechslung mal wieder ein etwas anderes Thema, was mir gerade Probleme macht. Ich scheine die Physics.IgnoreCollision noch nichts ganz begriffen zu haben. Ich nutze sie an mehreren stellen ab sie wird einfach ignoriert... obwohl er doch etwas anderes Ignorieren soll...

Mein Projektil hat einen Collider als Trigger.

public class ProjectileMovement : MonoBehaviour
{
    public float projectileSpeed = 2f;
    private Transform tr;

    public int damage;

    public GameObject hit;
    public GameObject erzeuger;
   

    void Start()
    {
        Physics.IgnoreCollision(erzeuger.GetComponent<Collider>(), GetComponent<Collider>());

        tr = GetComponent<Transform>();

        Destroy(gameObject, 5);
    }

    void Update()
    {
        tr.position += tr.up * projectileSpeed * Time.deltaTime;
    }

    void OnTriggerEnter(Collider collision)
    {
        Collider c = collision;

        if (c.gameObject == erzeuger)
        {
            Physics.IgnoreCollision(c, GetComponent<Collider>());
        }
        else if (c.gameObject.GetComponent<ProjectileMovement>() == true)
        {
            Physics.IgnoreCollision(c, GetComponent<Collider>());
        }
        else
        {
            try { c.gameObject.GetComponent<Health>().TakeDamage(damage); }
            catch  { }
        }

        OnHit();
        Destroy(gameObject);
    }

    void OnHit()
    {
        GameObject h = Instantiate(hit, tr.position, tr.rotation);
        Destroy(h, 0.5f);
    }
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich vermute aufgrund der Art der Nutzung der Methode in OnTriggerEnter, dass du die Funktionsweise etwas missverstanden hast, obwohl du die Methode in Start richtig nutzt.

Wenn du diese Methode aufrufst (und nicht false übergibst), dann wird von diesem Moment an die Kollision zwischen den beiden übergebenen Collidern ignoriert. Du hast also z.B. eine Wand und einen Ball, der darauf zu rollt. Wenn du IgnoreCollision aufrufst und Ball und Wand übergibst, bevor sich die beiden berühren, dann wird der Ball hindurchrollen. Und das auch beliebig oft, sollte der Ball zurückrollen. Und zwar so lange, bis du IgnoreCollision noch einmal mit den beiden Collidern und false aufrufst.

In Start machst du also alles richtig. Start wird ausgeführt, bevor die Physik-Engine das erste Mal mit dem Objekt arbeitet. Jegliche Kollision zwischen Projektil und Erzeuger wird deshalb für immer ignoriert. In OnTriggerEnter ist die Kollision allerdings schon in vollem Gange. Da gibt's dann nichts mehr zu ignorieren, das müsste vorher passieren. Du könntest hier einfach das machen, was du schon tust - mit GetComponent schauen, ob eine Reaktion stattfinden soll oder eben nicht - oder mit Layern arbeiten.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Okay... ich habe den Fehler gefunden. Passiert wahrscheinlich auch nur, wenn man Objecte aus dem Asset Store nutzt.

Mein Spieler hatte mehrere Collider. Ich habe ihm selber einen Mesh Collider gegeben aber in einem der Childs waren auch nochmal mehrere Collider. Als ich die gelöscht habe hat es so geklappt wie es sein soll... zumindest als ich es in die Start Methode geschrieben habe^^

Danke für die Hilfe!

 

P.S.: Bitte den Inspektor hier Ignorieren ich bekomme ihn nicht aus dem Beitrag gelöscht. Habe den Beitrag von meiner Frage zurück zu der Nachricht oben geändert.

image.png

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...