Jump to content
Unity Insider Forum
Sign in to follow this  
Peanut

Knockback in 2D spielen

Recommended Posts

Hallo ich finde keine richtige Lösung um ein Knockback einzubauen in mein 2D Spiel . Ich hab schon einpaar Videos angeschaut und den Code umgesetzt so das er funktionieren sollte aber der Knockback funktioniert nicht wie er soll . Wenn ich mit meinen Spikes zusammenstoße dann Porte ich mich immer vor die Spikes (markiert). Ob ich jetzt von links oder von rechts komme ist egal . Und einen richtigen Knockbackeffekt sodass ich in die Luft fliege erhalte ich auch nicht.

Hat da jemand ne Idee?

Knockback1.png

knockback2.png

Knockback3.png

Share this post


Link to post
Share on other sites

Hi,

ich sehe da mehrere Probleme mit deinem Code:

- innerhalb deiner while-Schleife in der Coroutine hast du kein 'yield return null;'. Das heißt, dass die Schleife in einem Frame bis zum Ende durchläuft.
In Zeile 118 hattest du schon den richtigen Ansatz, aber du musst es in die Schleife reinziehen, damit er nach jedem Durchlauf der Schleife bis zum nächsten Frame wartet.
Und ich bin mir grad nicht ganz sicher ob 'yield return 0;' auch geht, ich würde 'yield return null;' verwenden.

- es ist generell etwas unlogisch den Knockback über mehrere Frames auszuführen. Vor allem, weil du nach jedem Durchlauf die Velocity wieder auf 0 setzt.
Viel logischer klingt es doch dem Spieler einen starken Impuls zu geben, der ihn wegschubst. Dazu würde ich mal versuchen bei 'AddForce' den 'ForceMode' auf 'Impulse' zu setzten. ^

- du übergibst als Richtung für den Knockback die aktuelle Position des Spielers. Die Kraft drückt deinen Spieler also weg vom Ursprung der Szene.
Wenn du stattdessen von der Spielerposition die Position der Spikes abziehst (und den Vektor dann normalisierst), sollte der Spieler von den Spikes weggedrückt werden.
Dann kannst du ggf. noch einen gewissen Impuls nach oben geben.

 

Das würde dann etwa so aussehen:

public void Knockback(float pwr, float upPwr, Vector2 dir){
	dir.Normalize();
	rb2d.velocity = new Vector2(0, 0);
	rb2d.AddForce(dir * pwr + Vector2.up * upPwr, ForceMode2D.Impulse);
}
playerC.Knockback(100, 10, playerC.transform.position - transform.position); //Einheiten nicht getestet

 

Share this post


Link to post
Share on other sites

Cool hat funktioniert nur würde ich noch gerne implementieren das ich auch in X Richtung geknockbackt werde. Hat da jemand ne Idee :)?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×