Jump to content
Unity Insider Forum

OnTriggerEnter2D Collider zuweisen?


KarlEik

Recommended Posts

Hallo,

wie bekomme ich es hin "OnTriggerEnter2D" auf ein bestimmten Collider zuzuweisen, damit ich nicht für jeden Collider ein eigenes Skript machen muss?

Ich habe schon viel gesucht, aber nichts richtiges gefunden. Es muss eigentlich so in der Art sein oder?:

(PS: Programmire noch nicht lange)

sing System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Test : MonoBehaviour
{
  public Collider2D collider;
 
    void OnTriggerEnter2D(collider col)
    {
 
    }
}
Link zu diesem Kommentar
Auf anderen Seiten teilen

Moin!

Also... ich fang mal recht weit vorne an, ich glaube das hilft.

Wenn du so etwas schreibst:

void Blub(zeug)
{
  kram
}

dann nennt man das eine Methode. Das ist ein Stück Code, das ausgeführt werden kann. Wenn man "Blub" aufruft, dann passiert "kram". (Statt "void" kann da auch was anderes stehen, ist aber hier erstmal nicht wichtig.)

"zeug", also das, was in den runden Klammern steht, nennt man Parameter. Damit bestimmt man, wie "kram" passieren soll. Wenn du zum Beispiel eine Methode schreibst, die "Losgehen" heißt und das auch tun soll, dann ergibt es vielleicht Sinn, mit einem Parameter zu definieren, wohin das Objekt losgehen soll. Aber vielleicht weiß das Objekt das ja schon vorher und wartet nur noch auf das Startkommando - dann braucht die Methode keinen Parameter.

Wenn eine Methode einen oder mehrere Parameter hat, dann kann man sie nicht aufrufen, ohne für jeden Parameter einen Wert zu übergeben (lassen wir für's erste so stehen... ;)). Wenn du z.B. die Methode "transform.Translate" aufrufst, dann musst du beim Aufruf in die Klammern schreiben, in welche Richtung sich das Objekt bewegen soll:

transform.Translate(Vector3.up);

Irgendwo in Unity drin ist diese Methode definiert, und das sieht dann wieder so aus wie oben:

void Translate(Vector3 direction)
{
  kram
}

(Sieht in Wirklichkeit ein bisschen anders aus, aber das ist gerade nicht so wichtig.)

Und jetzt macht Unity halt irgendeinen "kram". Dabei benutzt es den Wert, den du beim Aufruf in die Klammern geschrieben ("übergeben") hast (Vector3.up), sodass du dich nach oben bewegst und nicht irgendwo anders hin.

Wenn du jetzt OnTriggerEnter2D als Methodennamen hast, dann ruft Unity diese Methode magisch für dich auf, wenn eben ein anderer Collider mit diesem Collider in Berührung kommt und einer davon ein Trigger ist. Jetzt ist es Unitys Aufgabe, da einen Wert zu übergeben. Und Unity übergibt da den Collider, mit dem dieses Objekt in Berührung gekommen ist. Also "den anderen" Collider zum Beispiel. Und du kannst jetzt entscheiden, was du mit dieser Information anfängst.

Du kannst zum Beispiel ganz simpel in die Konsole schreiben, wen du da berührt hast:

void OnTriggerEnter2D(Collider2D collider)
{
  Debug.Log(collider.gameObject.name + " hat mich berührt!");
}

Bemerke, dass da "Collider2D collider" steht. Ein Parameter ist immer wie eine Variable definiert, heißt:

Typ name

Der Typ bestimmt, was für eine Art von Wert hier übergeben werden kann (z.B. ein Vector3 wie bei Transform.Translate), aber hier ist es eben ein Collider2D. Normalerweise bist du beim Schreiben einer Methode der Chef und kannst da reinschreiben, was auch immer du meinst, was die Methode braucht, um richtig arbeiten zu können. Wenn du aber hier etwas anderes als "Collider2D" schreibst, dann weint Unity aufgrund von Problemen mit der Magie, die ich eben meinte.

"collider" ist hier ein beliebiger Name. Da kannst du auch "other" oder "otherCollider" oder "wurstbrot" hinschreiben. Wie du magst. Am Ende definierst du hier einfach einen Variablennamen, damit du im Rumpf der Methode (also dem "kram") beschreiben kannst, wovon du gerade redest. Hier zum Beispiel benutze ich collider.gameObject.name, also den Namen des GameObjects, zu dem der Collider2D gehört, und lasse ihn mit Debug.Log in der Konsole ausgeben. (Wieder ein Parameter hier, der in die Klammern kommt!) Hieße der Parameter anders, müsste ich halt wurstbrot.gameObject.name schreiben.

Jetzt kannst du mit einer if-Abfrage dein Objekt identifizieren. Für den Anfang, aber wirklich nur für den Anfang, kannst du da Tags oder Namen benutzen und die abgleichen. Das würde ich auf Dauer keinesfalls empfehlen, aber die Gründe dafür führen hier zu weit. Du kannst z.B. einem Objekt oben im Inspektor den Tag "Player" geben:

TagDropdown1.png

Und dann in deinem Code sowas schreiben:

void OnTriggerEnter2D(Collider2D collider)
{
  if (collider.gameObject.CompareTag("Player"))
  {
    Debug.Log("Der Player hat mich berührt!");
  }
}

Du kannst dem Collider2D auch sagen, dass er Dinge tun soll. Du kannst z.B. sein GameObject zerstören:

void OnTriggerEnter2D(Collider2D collider)
{
  if (collider.gameObject.CompareTag("Player"))
  {
    Destroy(collider.gameObject);
  }
}

Wenn jetzt der Player in diesen Trigger läuft, dann wird er sofort zerstört. Alle anderen Objekte werden nicht betroffen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

danke für deine Antwort Sascha! Trotzdem frag ich mich noch wie man den ein Collider von einem anderen GameObject auf ein Script zuweist. Ich erkläre es vielleicht:

Ich habe zwei GameObjecte: GameObjectA und GameObjectB . GameObjectA hat einen Collider2D und GameObjectB hat das Script. Wie bekomme ich es hin, dass das Skript von GameObjectB auf den Collider2D (mit OnTriggerEnter2D oder anders) von GameObjectA zugreifen kann? Also wenn der Collider2d vom GameObjectA kollidiert, will das Skript von GameObjectB es wissen ohne für jeden Collider ein eigenes Skript zu erstellen. Geht das überhaupt?

Ich bedanke mich schonmal.

Lg Karl

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 5 Stunden schrieb chrische5:

Ernst gemeinte Frage: Hast du eine Datenbank mit Antworten oder schreibst du das jedesmal neu?

Mein Blog ist genau als eine solche Datenbank gedacht, damit ich die allerhäufigsten Themen nicht immer neu abarbeiten muss :)

Wenn da was nicht drin vorkommt, dann schaue ich, ob ich einen alten Post wiederfinde (so wie beim Thema static), aber wenn ich keinen finde oder zu faul zum Suchen bin... dann wird das runtergerattert! Ist eine Art Code-Kata für mich. Schärft jedes Mal das eigene Verständnis um 0.1% ;)

vor 4 Stunden schrieb KarlEik:

ohne für jeden Collider ein eigenes Skript zu erstellen. Geht das überhaupt?

Die Antwort auf diese Frage ist immer "ja". Es gibt keinen Fall, in dem man "für jedes X" ein neues Script schreiben müsste. Versprochen!

vor 4 Stunden schrieb KarlEik:

Wie bekomme ich es hin, dass das Skript von GameObjectB auf den Collider2D (mit OnTriggerEnter2D oder anders) von GameObjectA zugreifen kann?

Kommt halt auf die Situation an! OnTriggerEnter2D ist halt dafür da, um einen Collider einem Script vorzustellen. Und zwar genau den Collider, der gerade in den eigenen reingeflogen ist; oder umgekehrt. Ist also super, wenn du z.B. einen Trigger haben willst, in den der Spieler reinläuft und dann passiert etwas.

Wenn die vorgesehene Interaktion aber nicht so aussieht, dass ein anderer Collider den eigenen berührt, dann gibt's andere Wege, die da sinnvoller sind. Aber das scheint hier ja nicht der Fall zu sein...

vor 4 Stunden schrieb KarlEik:

Also wenn der Collider2d vom GameObjectA kollidiert, will das Skript von GameObjectB es wissen

Genau das passiert doch hier schon?

Wenn du dein GameObjectA wirklich "GameObjectA" nennst und dann das hier in ein Script auf GameObjectB packst:

void OnTriggerEnter2D(Collider2D collider)
{
  Debug.Log(collider.gameObject.name + " hat mich berührt!");
}

dann wird bei einer Berührung (sofern alle Bedingungen erfüllt sind) in der Konsole

GameObjectA hat mich berührt!

auftauchen. Und wenn ein anderes GameObject reinfliegt dann steht da eben dessen Name. Der Parameter "collider" (oder wie auch immer du ihn nennst) sagt dir genau das, was du ja wissen willst: Welcher Collider das ist, der "mich" da gerade berührt hat.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

alles was du geschrieben hast wäre ja richtig wenn GameObjectB auch einen Collider2D hat, aber das GameObjectB hat keinen Collider2D sondern nur GameObjectA. GameObjectB hat ein Skript. Das Skript möchte wissen ob GameObjectA kollidiert. 

Es sollen nachher GameObjectA,C,D,E ... einen Collider2D haben. Das Skript auf GameObjectB soll erkennen welches GameObject kollidiert. Wenn alle GameObjecte mit collider2D ein Skript hätten, würde es mit OnTriggerenter und co ja gehen. Aber ich wollte 1 Skript für mehrere Collider2D nehmen.

Ich hoffe man versteht es.

Lg Karl

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...