Jump to content
Unity Insider Forum

Charakter hängt an Collidern


SyntaxTalkstoMe

Recommended Posts

Moin,

ich hab eigentlich schon länger das Problem, dass wenn der Charakter an einen Collider knallt, dass er festhängt. Bleibt einfach kleben. Was macht man da am besten?

DIe Collision Detection ist bereits auf Continous eingestellt. Ich hab mir auch schon paar Gedanken gemacht. Aber ich weiß nciht, ob das optimale Lösungen wären:

 

1. Den entsprechenden Hindernissen ein Bouncing Material hinzuzufügen, damit der Charakter ein bisschen abprallt?

2. Der Charakter bleibt vermutlich hängen, weil wenn er es berührt, die Schwerkraft einsetzt. Daher evlt ein Script schreiben, dass sobald der Charakter mit etwas kollidiert, die Schwerkraft nach unten setzt, damit der Charakter einfach abschmiert? 

 

Gruß und schönen Abend noch

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 10 Minuten schrieb SyntaxTalkstoMe:

DIe Collision Detection ist bereits auf Continous eingestellt

Wie der Name der Eigenschaft sagt, handelt es sich um Kollisionsdetektion. Das Verhalten deines Rigidbodys bezüglich Reibung usw. hat mit dieser Eigenschaft nichts zu tun.

Ich nehme an, du redest von seitlicher Bewegung, und dass dein Charakter mit Rigidbody gegen eine Wand fliegt und dann nicht herunterrutscht. Wenn dem so ist, liegt dein Problem in deinem Bewegungsscript. Ein reales Objekt, das gegen eine vertikale Wand fliegt, verliert seine horizontale Geschwindigkeit. Je nachdem, wo die Energie hingeleitet wird, geht sie gegen null oder wird zurückgegeben und das Objekt prallt ab. Dieses Verhalten kannst du durch Bounciness einstellen. Aber auch die Standard-Bounciness von 0 bedeutet kein Hängenbleiben, das ist also nicht die Lösung.

Du wirst ein Bewegungsscript haben, das den Rigidbody horizontal beschleunigt. Hier liegt das Problem wirklich - auch, wenn der Charakter gegen eine Wand prallt, fügt dieses Script weiterhin Kraft in Richtung Wand hinzu. Stelle dir eine Wand vor, die dich mit künstlicher Schwerkraft anzieht. Vielleicht kennst du ja sogar die Stargate-Folge :P. Da rutscht du auch nicht dran herunter, weil die Kraft, die dich zur Wand zieht (oder drückt) stärker ist als die normale Schwerkraft.

Die Lösung ist daher, nicht mehr konstant horizontale Kraft hinzuzufügen, sondern z.B. während eines Sprungs die horizontale Bewegung des Rigidbodys in Ruhe zu lassen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dann lag ich ja nah dran mit meiner Vermutung.

Und ja, es handelt sich um ein Objekt, wo der SPieler dann horizontal dranprallt.

Die Krux an der Sache ist, dass der Charakter sich in meinem Spiel automatisch horizontal in eine Richtung bewegt. Von daher ist es an der Stelle schwierig, keine horizontale Kraft hinzufügen. Es sei denn, ich habe dich damit jetzt falsch verstanden.

Aber wie lös ich das dann? Evlt ein Raycast der überprüft ob ich irgendwo dagegenlaufe und dann die Schwerkraft runtersetzt? Aber das hört sich eher nach einer Notlösung an. Es soll sauber programmiert sein.

Ja die Folge kenn ich :) 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Witzig, genau das Thema hatte ich gerade schon in einer anderen Community. Endless Runner, Klebenbleiben an Plattformen. Die Sache ist die: Du willst bei einem Endless Runner zwar konstant nach rechts (oder geradeaus) bewegen, aber eben nur, bis eine Wand getroffen wird. In diesem Fall gibt es zwei Möglichkeiten: Der Spieler verliert das Spiel oder die horizontale Bewegung hört auf. In beiden Fällen kannst du mit OnCollisionEnter prüfen, ob der getroffene Collider vor der Spielfigur ist oder eben nicht (z.B. bei einem Boden). Im Falle einer Kollision mit der Wand kannst du dann so reagieren, wie du es für dein Spiel für richtig hältst.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja, normal ist dann das Spiel verloren wenn er stehen bleibt. Aber mein Spiel bietet ein paar Möglichkeiten irgendwo hängen zu bleiben :)

Ich werd mal gucken. Hätte nur gedacht, dass es evlt irgendwo ein kleines Häckchen gibt, das alle Probleme löst *g*

 

Edit:

   if (collision.gameObject.CompareTag("nonDestroyableObject"))
        {
            rb2d.gravityScale = 0;
        }
    }

    private void OnCollisionExit2D(Collision2D collision)
    {
        rb2d.gravityScale = gravitiyScale;
    }
}

läuft 👍

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...