Jump to content
Unity Insider Forum

HELP > Spieler Animation nicht 100% korrekt! Anfängerfehler?


Splashy

Recommended Posts

Hallo!

Ich bin ein blutiger Anfänger und kämpfe gerade mit meinem Pinguin-Spieler der nicht genau das macht, was ich will 😉

Wenn die Taste "W" und dann die Taste "A" oder "D" gedrückt wird, bewegt sich der Spieler nach oben und dann nach rechts beziehungsweise nach links.
Der Spieler "schaut" dann auch korrekterweise nach rechts oder links. 😀

Wenn JEDOCH die Taste "S" und dann die Taste "A" oder "D" gedrückt wird, bewegt sich der Spieler nach unten und dann nach rechts beziehungsweise nach links.
ABER dabei "schaut" der Spieler nicht nach recht oder links!!! 🥵

Warum? Die beiden Blend-Trees (für Idle und walking) sind korrekt denke ich... Was mache ich falsch?

 

Im Anhang findet Ihr ein Video der "falschen" Bewegung, das Movement-Script und das komplette Unity-Projekt als Export.

 

Vielen Dank im Voraus!

PlayerMovement.cs Pinug.unitypackage

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich find die Sache mit dem PlayerMovePoint schon etwas seltsam, aber wenn's für dich funktioniert... da liegt aber auch das Problem. Du machst die Bewegung über Vector3.MoveTowards auf eine Position zu, die über mehrere Frames hinweg zu weit weg sein kann. Die Ausrichtung machst du aber direkt über den Input. Dein Pinguin läuft also immer noch ein bisschen weiter, obwohl du schon in eine andere Richtung lenkst, die Animation springt aber sofort um.

Ich würde das mit dem PlayerMovePoint nochmal überdenken, ist eine etwas komplizierte Lösung für ein recht simples Problem, aber ansonsten kannst du auch in den Zeilen 52 und 53 statt userInput einfach

PlayerMovePoint.position - transform.position

nehmen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Sascha!

Das funktioniert ja super mit deiner Korrektur! Vielen Dank!!

Wie gesagt, ich bin ein blutiger Anfänger, daher habe ich halt einfach ein Youtube Video genommen und die Bewegung auf dem Grid nachgebaut. Aber ein würde mich schon noch interessieren: Darf ich Dich fragen, wie Du das gelöst hättest? Dann kann ich noch was dazulernen...

Gerne würde ich gerne mich revangieren für deine Hilfe: Hast Du Patreon?


THX!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Sascha

Ich habe gerade bemerkt, dass deine Lösung doch noch einen Hacken hat, da der Spieler noch weitere Animationen ausführt: Wenn er einen IceCube mit "Space" zerstört, dann wird jedes Mal die Front-Animation mit dem Hammer gespielt anstelle der jeweilig richtigen (right, left, up and down).

Wenn Du mir deine Lösung des Movements zeigen könntest, wäre das super! Evtl. löst das ja meine Probleme?!
Ich habe einige Beispiele aus dem Internet ausprobiert, jedoch hatten alle, bis auf meine Lösung, das Problem, dass der Spieler ganz kurz (ca. 1 Frame) "gestoppt" hat auf dem Grid. Daher habe ich das mit dem PlayerMovePoint gewählt.

Ich habe die neueste Version des Spiels hinterlegt und hoffe, dass Du mir helfen kannst...

Vielen Dank! 😀

Pingu2.unitypackage

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 29 Minuten schrieb Splashy:

Das funktioniert ja super mit deiner Korrektur! Vielen Dank!!

Freut mich!

vor 29 Minuten schrieb Splashy:

Darf ich Dich fragen, wie Du das gelöst hättest? Dann kann ich noch was dazulernen...

Naja, du hast ne einfache Bewegung ohne Schnickschnack wie einem Grid. Da kann man einfach mit einem Collider2D (z.B. einem CircleCollider2D) und einem Rigidbody3D anfangen. Dann schmeißt du deinen Input-Vektor multipliziert mit deinem Speed-Wert als velocity da rein und fertig. Für deterministische Ergebnisse (also dass es garantiert auf jedem Rechner mit jeder Framerate gleich abläuft) immer™ in FixedUpdate arbeiten.

private Rigidbody2D rigidbody2D;
public float speed = 10f;

private void Awake()
{
  rigidbody2D = GetComponent<Rigidbody2D>();
}

private void FixedUpdate()
{
  Vector2 userInput = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"));
  
  rigidbody2D.velocity = userInput * speed;
}

Wenn du Beschleunigung willst statt durchgehend 100% Tempo, kannst du statt der letzten Zeile auch beschleunigen:

Vector2 targetVelocity = userInput * speed;
rigidbody2D.velocity = Vector2.MoveTowards(rigidbody2D.velocity, targetVelocity, acceleration * Time.deltaTime);

(acceleration ist dann oben public so wie speed, damit du es im Editor einstellen kannst)

Das geht für vieles ganz gut, kann aber auf Dauer ein paar Problemchen geben. Rigidbodys bouncen manchmal ungewollt etwas, wenn man z.B. an einer geraden Wand entlang läuft, die aber aus mehreren Collidern besteht. Dafür, dass man aber nur so drei, vier Zeilen Code braucht, sind die Ergebnisse schon immer ganz gut. Und bei Top-Down-Spielen fällt das sowieso selten auf, 2D-Plattformer sind da problematischer.

Damit's nicht ruckelt, einfach den Rigidbody im Inspector auf "Interpolate" stellen.

Für deine Animation kannst du einfach noch die zwei Zeilen reintun, die du schon hast, um userInput in den Animator zu quetschen.

vor einer Stunde schrieb Splashy:

Gerne würde ich gerne mich revangieren für deine Hilfe: Hast Du Patreon?

Oha, du meinst es gut! Nein, habe ich nicht. Wenn du in Spendierlaune bist, könnte dir vielleicht eines meiner Assets im Asset Store gefallen. Da hast du dann auch noch direkten Gegenwert ;)

Mal davon abgesehen: Immer schön Fortschritte mit deinem Projekt teilen, dann kann man sich darüber freuen :)

vor 34 Minuten schrieb Splashy:

Ich habe einige Beispiele aus dem Internet ausprobiert, jedoch hatten alle, bis auf meine Lösung, das Problem, dass der Spieler ganz kurz (ca. 1 Frame) "gestoppt" hat auf dem Grid. Daher habe ich das mit dem PlayerMovePoint gewählt.

Meine Lösung (aber eigentlich viele andere genauso 🤔) weiß nicht einmal, dass es so etwas wie Animationen gibt. Wenn der Animator irgendetwas macht, dann kriegt der Rigidbody davon nicht einmal was mit. Achte sicherheitshalber aber darauf, dass beim Animator "Root Motion" aus ist (oder wie das heißt), damit der Animator nicht versucht, eigenständig die Bewegung des Charakters zu manipulieren.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Sascha

vor 12 Stunden schrieb Sascha:

Damit's nicht ruckelt, einfach den Rigidbody im Inspector auf "Interpolate" stellen.

Das merke ich mir! Danke!

Aber leider haben wir uns offensichtlich falsch verstanden: Der Spieler soll sich ja auf einem "Grid" (1 Einheit in Unity) jeweils bewegen und auch stehenbleiben ausser, der Spieler hält die jeweiligen Taste gedrückt. Deine Lösung bewegt den Spieler ohne "Grid", was nett ist, aber nicht meine Vorstellung. Im Video sieht man, dass das vorher möglich war.

Ich habe den aktuellen Stand nochmals in den Anhang gestellt: Einziges Problem das ich habe ist:

Zitat

 

Wenn die Taste "W" und dann die Taste "A" oder "D" gedrückt wird, bewegt sich der Spieler nach oben und dann nach rechts beziehungsweise nach links.
Der Spieler "schaut" dann auch korrekterweise nach rechts oder links. 😀

Wenn JEDOCH die Taste "S" und dann die Taste "A" oder "D" gedrückt wird, bewegt sich der Spieler nach unten und dann nach rechts beziehungsweise nach links.
ABER dabei "schaut" der Spieler nicht nach recht oder links!!! 🥵

 

Könntest Du mir bitte genau hier weiterhelfen?

THX!

pingu3.unitypackage

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habe mir dein Projekt einmal angeschaut. Es war etwas tricky zu testen, weil man immer an den Eisblocks kleben bleibt. Aber es ging schon.

Dein Animationsproblem ist der Blendtree! Wenn Y -1 erreicht wird, hat X keine Auswirkung mehr beim Überblenden. Das ist natürlich doof, aber so ist das System nun mal.
Du kannst es so ändern, dass das maximale -Y nicht erreicht wird. Also entweder den Wert, den du übergibts, nie auf -1 kommen lassen, oder aber den Point noch etwas nach unten schieben, so auf -1.05.

Blendtrees eignen sich eigentlich nicht für 2D Animationen, wo keine Bones geblendet werden können. Aus diesem Grund würde ich das an deiner Stelle nicht nutzen.
Das Einzige, was sie bei dir bringen, ist ein etwas aufgeräumterer Animator.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo malzbie

Vielen Dank für deine Zeit! Wenn ich Dich richtig verstehe, würdest Du anstelle von BlendTrees also einzelne Animationen steuern?

Ich habe inzwischen einen Weg gefunden ohne grosse Anpassung des Codes und die BlendTrees kann ich so auch beibehalten (es sollen ja noch weitere folgen):

Ich habe bei der Down-Animation im BlendTree eine Animation DownLeft und DownRight eingebaut (jeweils auf 0.5 bzw. -0.5). Funktioniert wunderbar! 😇

Ich hoffe, dass das mal jemanden andrem nutzt. Hab Stunden verbraten deswegen!!!

@malzbie: Vielen Dank nochmals für deine Input!

@Sascha: Auch Dir nochmals vielen Dank! Und gerne werde ich im Assets-Store mal schauen ob da was spannendes drin ist! THX!!!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...