Jump to content
Unity Insider Forum

Movement-Script optimieren?


Erdnussknacker

Recommended Posts

Moinsen, ich habe grade mein Movement-Script etwas überarbeitet. Ich muss dabei den Parameter "Speed" im Animator ändern und das Laufen, sowie auch das Sprinten realisieren, d.h. die Variable "speed" (kleingeschrieben) anpassen:

 

float vertical = Input.GetAxis("Vertical");

if(vertical == 0.0f)
 {
  animationControl.SetFloat("Speed", 0.0f);
 }
 else
 {
  // --- Forward ---
  if(!isJumping && Input.GetButton("Sprint") && vertical > 0.0f)
  {
speed = runSpeed;
animationControl.SetFloat("Speed", Mathf.Lerp(0.6f, 1.0f, 2));
  }
  if(!isJumping && !Input.GetButton("Sprint") && vertical > 0.0f)
  {
speed = walkSpeed;
animationControl.SetFloat("Speed", Mathf.Lerp(1.0f, 0.6f, 2));
  }
  // --- Backward ---
  if(!isJumping && Input.GetButton("Sprint") && vertical < 0.0f)
  {
speed = runSpeed;
animationControl.SetFloat("Speed", Mathf.Lerp(-0.6f, -1.0f, 2));
  }
  if(!isJumping && !Input.GetButton("Sprint") && vertical < 0.0f)
  {
speed = walkSpeed;
animationControl.SetFloat("Speed", Mathf.Lerp(-1.0f, -0.6f, 2));
  }
 }

 

So sieht das Ganze aus. Etwas ähnliches muss ich natürlich auch für Links- und Rechts-Bewegung machen, aber irgendwie möchte ich nicht zwei von diesen großen "if"-Blöcken im Script haben. Kann man das Ganze noch eleganter lösen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Da gibt's ne Menge :)

z.B.

if(a &&  {}
if(a && c) {}

...da kann auch schreiben:

if(a)
{
 if( {}
 if(c) {}
}

 

Aber was viel wichtiger ist:

Mathf.Lerp(-1.0f, -0.6f, 1)

Das meinst du glaube ich nicht so. Da kommt konstant -0.6 raus, das willst du vermutlich nicht.

 

Deinen momentanen Code kann man auch so schreiben:

float vertical = Input.GetAxis("Vertical");

if(!isJumping)
{
 bool sprint = Input.GetButton("Sprint");
 speed = sprint ? runSpeed : walkSpeed;

 int forward = vertical > 0 ? 1 : -1;
 float speed = sprint ? 1 : 0.6f;
 animationControl.SetFloat("Speed", forward * speed);
}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Deinen momentanen Code kann man auch so schreiben:

 

float vertical = Input.GetAxis("Vertical");

if(!isJumping)
{
 bool sprint = Input.GetButton("Sprint");
 speed = sprint ? runSpeed : walkSpeed;

 int forward = vertical > 0 ? 1 : -1;
 float speed = sprint ? 1 : 0.6f;
 animationControl.SetFloat("Speed", forward * sprint);
}

 

Den gesamten Code? Das mit Lerp meine ich so wirklich nicht, stimmt. Danke für den Tipp. :) Ich bin noch neu in Unity bzw. C#, was genau machen die "?". Ich hab die noch nie so im Code benutzt, eine kleine Erklärung dafür wäre sehr freundlich. :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ein Problem hab ich noch, ich stell mich wohl einfach total blöd an. :rolleyes: Im Animator muss ich noch den "Speed"-Parameter beim nach vorne Sprinten auf 1 setzten, beim nach vorne Gehen auf 0.5, und bei der Rückwärtsbewegung das Gleiche, nur umgekehrt (-0.5 / -1). Das funktioniert mit dem von Sascha geposteten Code leider nicht, nur für die Vorwärtsbewegung. Könnte mir jemand noch schnell einen Hinweis geben, wie ich das Ganze realisieren könnte? :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Eigentlich macht mein Code das.

forward ist -1 oder 1 und wird dann mit speed multipliziert. Ich hab 1:1 deinen Code nachgebaut, nur in anders ;)

 

Ich hab den Teil, der für die Bewegung zuständig ist, so gemacht. Also genau wie du:

 

bool sprint = Input.GetButton("Sprint");
speed = sprint ? runSpeed : walkSpeed;

 

Der Teil, der für die Animation zuständig war, den du gepostet hast, hat nicht funktioniert:

 

float speed = sprint ? 1 : 0.6f;

Denn diese Zeile erzeugt eine neue Variable "speed" obwohl diese schon existiert.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dann gibt es ja aber immer noch 2 mal die Variable "speed", einmal für den Animator und einmal für den richtigen Speed des Spielers.

 

bool isRunning = Input.GetButton("Sprint");
speed = isRunning ? runSpeed : walkSpeed;

int forward = vertical > 0 ? 1 : -1;
float animSpeed = isRunning ? 1 : 0.6f;
animationControl.SetFloat("Speed", forward * animSpeed);

 

So funktioniert die Bewegung richtig, die Vorwärtslauf-Animation auch. Aber sobald man stehen bleibt, läuft die Rückwärtslauf-Animation.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja dann musst du noch die Verticale 0 mit rein bringen.

Idle macht er doch bestimmt nur wenn der Wert 0 ist, oder?

In dem Video ist genau das am Schluss gezeigt, was du noch bauchst. Dort ist es nur das "beinahe Tot". ;)

 

Super, das hat funktioniert. :) Am Ende sieht das Ganze so aus:

 

bool isRunning = Input.GetButton("Sprint");
speed = isRunning ? runSpeed : walkSpeed;

int animVertical = vertical > 0 ? 1 : vertical < 0 ? -1 : 0;
float animSpeed = isRunning ? 1 : 0.5f;
animationControl.SetFloat("Speed", animVertical * animSpeed);

Link zu diesem Kommentar
Auf anderen Seiten teilen

*Kopfklatsch*

Aua, das hab ich echt übersehen.

 

Mathf.Sign kannte ich auch noch nicht. Ist aber auch sehr redundant zum ternären Operator.

Eine Methode, die -1, 0 und 1 zurück geben kann, wäre vielleicht interessanter :P

 

Sehr lesbar ist die aktuelle Lösung aber nicht, ich würde mindestens noch die ternären Ausdrücke klammern wollen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...