Jump to content
Unity Insider Forum

Richtungs wechsel bei Collision mit 2D on TriggerEnter()


Thanny08

Recommended Posts

Moin Moin,

 

Ich bin gerade dabei ein kleines Spiel zu Entwickeln und komme gerade nicht weiter.

In meinem Spiel wird es so sein, das wenn man durch einen bestimmten Collider geht, die richtung umgedreht werden soll und bei einer collision mit einem weiterem die Richtung wieder ,,normal" ist.(mein Spieler bewegt sich automatisch)  Ich habe es versucht doch nicht hinbekommen... Für Hilfe wäre ich sehr dankbar!!

 

LG

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ohne jegliche Info, wie dein Code bisher funktioniert, kann man dir nur sehr abstrakte Hilfe geben.

Irgendwo sagst du halt "Geh nach rechts" und "Geh nach links". Wenn du den Collider berührst (ich nehme an, du meinst einen Trigger, also OnTriggerEnter), stellst du irgendwo was um. Entweder ein bool oder ein int, das 1 oder -1 ist. Da, wo du deinen Bewegungscode hast, liest du dann den Wert aus und sorgst dafür, dass die Richtung ggf. die jeweils andere ist.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Okay erstmal vilen Dank und sorry das das so unspezifisch war...

 

Also ich habe es versucht und es hätte geklappt aber ich habe den ,,void OnTriggerEnter2D(Collider2D other)" schon benutzt um den Player nach einer Kollision zu killen.

Wenn der Player also den Collider berührt der eigendlich die Richtung drehen sollte, stirbt der Player. Ich suche nun also einen Weg um den Collider2D so zu spezifiezieren das ich nicht nur einmal den OnTriggerEnter2D benutzen zu können...

 

hier noch das Script was ich bisher für die Bewegung meines Players habe:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class PlayerMovement : MonoBehaviour
{
    public int speed = 7;
    // Start is called before the first frame update
     
    private void Update()
    {
            Vector3 movementPlayer = new Vector3(speed, 0, 0);

            transform.Translate(movementPlayer * Time.deltaTime);
    }
  
    void OnTriggerEnter2D(Collider2D other)
    {
        if (other.CompareTag("Richtungswechsel"))
        {
            speed = -7;
        }
    }
}

Und dieses funktioniert nicht solange dieses Script für den Kill bzw Respawn aktiv ist:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class Respawn : MonoBehaviour
{
    public int RespawnPlayer;

    private void OnTriggerEnter2D(Collider2D other)
    {
        if (other.CompareTag("Player"))
        {
            SceneManager.LoadScene(RespawnPlayer);
        }
    }
}

Wenn jemand eine Idee hat wie ich das machen könnte wäre  ich dankbar!!!

 

Viele Grüße

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich hab deinen Code mal in Code-Blöcke eingefügt, dann kann man das besser lesen. Geht ganz einfach mit dem <>-Knopf über dem Textfeld ;)

Also... du hast hier generell zwei Herangehensweisen. Du solltest dich für eine entscheiden, aber aktuell benutzt du beide gleichzeitig.

Entweder, deine Figur(en) schauen, was sie da berührt haben, oder deine Trigger schauen, wer sie berührt hat. Alternativ kann man es auch etwas komplizierter machen, und die Figur schaut selber, lässt dann aber den getroffenen Trigger entscheiden, was das heißt. Funktionieren tun am Ende alle drei Varianten, und es gibt bei jeder Vorteile.

Wenn deine Trigger allesamt eigentlich immer nur eine Art von Figur betreffen (z.B. immer nur den Spieler), dann kann man schon das OnTriggerEnter-Script auf die Trigger packen. Das hat automatisch den Vorteil, dass du immer nur genau den einen Code in deinem Script hast, so wie bei deinem Respawn-Script.

Tags sind zwar am Anfang sehr praktisch, werden aber sehr schnell kacke. Ich empfehle dir, sie dir abzugewöhnen. Statt CompareTag("Player") kannst du auch einfach fragen, ob eine Spielerfigur-spezifische Komponente auf dem GameObject liegt:

private void OnTriggerEnter2D(Collider2D other)
{
  if (other.GetComponent<PlayerMovement>())
  {
    SceneManager.LoadScene(RespawnPlayer);
  }
}

Und wenn du das als Technik verinnerlichst, wird auch die Lösung für dein Richtungswechsel-Problem ganz einfach. Das hier könnte in deinen Richtungswechsel-Trigger:

private void OnTriggerEnter2D(Collider2D other)
{
  var playerMovement = other.GetComponent<PlayerMovement>(); // playerMovement wird den Wert null haben, wenn das Objekt die Komponente gar nicht hat
  if (playerMovement) // if-Bedingung ist hier false, wenn playerMovement null ist
  {
    playerMovement.speed = -7;
  }
}

Hier hast du mit GetComponent direkt zwei Dinge auf einmal: Den Check, ob es sich um den Spieler handelt, und eben das Holen der Referenz auf die Komponente, von der wir den Wert ändern wollen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Vielen vielen Dank für deine kompetente Hilfe!

Es hat alles bestens geklappt und ohne deine Hilfe hätte ich das nie hinbekommen. 

Das einzige was ich immer noch vergeblich suche ist eine Möglichkeit auf die Gravity eines GameObjects über ein Script zuzugreifen und diese zu verändern. 

Ansonsten bedanke ich mich nochmal für deine Hilfe und hoffe das alle deine Hilfe so sehr schäzen wie ich! Vielen vielen Dank!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Kein Ding, freut mich :)

vor 47 Minuten schrieb Thanny08:

Das einzige was ich immer noch vergeblich suche ist eine Möglichkeit auf die Gravity eines GameObjects über ein Script zuzugreifen und diese zu verändern.

Kommt drauf an, wie die Gravitation implementiert ist. Hast du dafür einen Rigidbody in Benutzung? Wenn ja, dann benutzt dieser ausschließlich die globale Gravitation. Für "persönliche" Gravitation musst du die Gravitation beim Rigidbody ausschalten und mit einem Extra-Script (oder indem du ein vorhandenes erweiterst) selber Gravitation machen, indem du in FixedUpdate AddForce machst, am besten mit ForceMode.velocityChange (das entspricht dem, was Physics.gravity macht).

Du änderst die Gravitation dann, indem du in deinem Trigger-Script zum Gravitations-Script gehst und da den selber programmierten Gravitations-Wert änderst.

Ist übrigens ein super Beispiel dafür, was man alles mit komponenten-basiertem Design machen kann. Wenn du extra eine Gravitationskomponente machst anstatt die Funktionalität in die Player-Komponente zu integrieren, kannst du diese Komponente auch Gegnern geben, damit diese auch beeinflusst werden können. Lässt du die Komponente weg, hat der Trigger keinen Einfluss. Das Trigger-Script sucht dann statt nach der Player-Komponente exakt nach der Komponente, die es auch beeinflussen will - egal, wer sie hat. Das ist eine der Sachen, die man mit Tags nicht so wirklich machen kann.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...