Jump to content
Unity Insider Forum

OnTriggerEnter ohne Kollision


dosenbiiir

Recommended Posts

Hey ho Leute

 

Ich habe da ein kleines Problem und zwar wird von einem Collider die Methode OnTriggerEnter2D ausgelöst obwohl keine Kollision vorliegt. (bzw OnTrigger)

Also mein Spieler besteht aus einer Plane und 2 Collider 2D(einen für Füße, Beine und Oberkörper; und einen für den Kopf) jetzt habe ich einem Collider2D vor den Spieler gesetzt aber höher als das zum ende des Spielers. Somit berührt der Collider niemals den Boden. Damit möchte ich rauszufinden ob er gegen ein Hinderniss (z.b. eine Wand) gelaufen ist. Denn dann soll er tot sein oder ein leben verlieren. funktioniert auch soweit. Nur das Problem ist wenn der Spieler eine gewisse Höhe runter fällt wird die Methode OnTriggerEnter2D trotzdem aufgerufen obwohl der Collider niemals den Boden berührt.

wie kann ich das nun verhindern ? oder warum wird es trotzdem aufgerufen ?

 

Der Spieler bewegt sich mithilfe von rigidbod2D.velocity

 

liebe grüße

dosenbiiir

Link zu diesem Kommentar
Auf anderen Seiten teilen

Probier mal ne gameObject Tag Abfrage einzubauen und geb der Wand diesen Tag, dann ist es ja eigentlich egal, ob er den Boden berührt. Vielleicht berührt der Trigger auch beim Aufprall einen Collider vom Körper.

 

werde ich wohl zwangsläufig machen müssen :/ das Problem ist das diese 'Wände' auch als Boden funktionieren ^ das wird so ein Jump and Run ...

und es berührt 100% ig den Boden habs geprüfte mit Debug.Log(hit.gameObject.name);

nur da ist immer ein großer Abstand zwischen dem Boden und dem Collider ... merkwürdig

post-1797-0-69729300-1415396562_thumb.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen

mhh, ich kann da jetzt eigentlich nur noch vermuten, da ich so ein Problem noch nicht hatte. Ich kann mir vorstellen, dass die Fallgeschwindigkeit so hoch ist, dass die Physic Engine nicht mehr klarkommt. Probier doch mal die Fallgeschwindigkeit zu verringern.

 

die fallgeschwindigkeit ist nicht groß das sollte kein Problem darstellen. (anscheinend ja doch irgendwie :/ ...) aber verringern kann ich sie nicht.

PS: ich habe ein Bild angehängt an den Kommentar von davor :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

mach mal den Trigger an ein eigenes GameObject. Dein Skript fragt ja alle Collider ab. Geh ich mal von aus.

 

Edit: Obwohl ist eig. Unlogisch, da die anderen Collider ja nicht auf Trigger gesetzt sind. Die überlappen auf dem Bild auch so komisch. Kannst du das nicht mal ändern?

 

Der Collider ist bereits in einem eigenen gameObject ^^ sieht man auf dem Bild jetzt nicht :) wenn ich den Collider kleiner mache damit er sich nicht mehr überlappt ist er schon fast zu klein für unity aber ich versuche es morgen mal denke das ändert aber nichts ... aber danke für deine Hilfe ^^

Link zu diesem Kommentar
Auf anderen Seiten teilen

Joa, so läuft das in der Physikengine. Objekte prallen nicht irgendwo gegen, sondern landen in irgendetwas drin und werden dann wieder raus gesetzt - das passiert natürlich zwischen zwei Frames, sodass man die kaputte Invariante nicht sieht. Die Events werden trotzdem ausgelöst.

 

Ich denke, die schlauste Lösung wäre, das nicht über einen Trigger zu machen, sondern über OnCollisionEnter2D mit den anderen beiden Collidern.

void OnCollisionEnter2D(Collision2D collision)
{
 foreach(var contact in collision.contacts)
 {
if(IstAnDerSeite(contact.point)
{
  Die();
}
 }
}

Man muss sich dann nur ausdenken, wie IstAnDerSeite implementiert sein soll.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Joa, so läuft das in der Physikengine. Objekte prallen nicht irgendwo gegen, sondern landen in irgendetwas drin und werden dann wieder raus gesetzt - das passiert natürlich zwischen zwei Frames, sodass man die kaputte Invariante nicht sieht. Die Events werden trotzdem ausgelöst.

 

Ich denke, die schlauste Lösung wäre, das nicht über einen Trigger zu machen, sondern über OnCollisionEnter2D mit den anderen beiden Collidern.

void OnCollisionEnter2D(Collision2D collision)
{
 foreach(var contact in collision.contacts)
 {
if(IstAnDerSeite(contact.point)
{
  Die();
}
 }
}

Man muss sich dann nur ausdenken, wie IstAnDerSeite implementiert sein soll.

 

hatte ich mir schon irgendwie gedacht hielt es aber für unwahrscheinlich aber dann wird es wohl daran liegen ...

ich weiß nur noch nicht wie ich mit dem IstAnDerSeite umgehen soll. Könntest du mir da nochmal kurz helfen? :)

Danke für deine Hilfe :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hab da eben mal mit rumgespielt. Mit dem Code läuft es bei mir wunderbar. Ich weiß aber nicht, ob das so optimal gelöst ist.

 

void OnCollisionEnter2D(Collision2D collision)
{
 foreach(var contact in collision.contacts)
 {
  Vector2 pointNormal = contact.point.normalized;
  if(pointNormal.x >= 0.99f)
  {
Debug.Log("Damage");
  }
 }
}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...