Erdnussknacker Geschrieben 7. März 2014 Melden Share Geschrieben 7. März 2014 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 More sharing options...
Sascha Geschrieben 7. März 2014 Melden Share Geschrieben 7. März 2014 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 More sharing options...
Erdnussknacker Geschrieben 7. März 2014 Autor Melden Share Geschrieben 7. März 2014 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 More sharing options...
AgentCodeMonk Geschrieben 7. März 2014 Melden Share Geschrieben 7. März 2014 guckst nach ternären operatoren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Erdnussknacker Geschrieben 7. März 2014 Autor Melden Share Geschrieben 7. März 2014 guckst nach ternären operatoren Danke sehr, die Entwickler machen da ja super Videos zu. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 8. März 2014 Melden Share Geschrieben 8. März 2014 Ich hätte dir ohne Link erstmal nicht geglaubt, dass es von Unity Tech ein Video zum ternären Operator gibt Schräg Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Erdnussknacker Geschrieben 8. März 2014 Autor Melden Share Geschrieben 8. März 2014 Ein Problem hab ich noch, ich stell mich wohl einfach total blöd an. 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 More sharing options...
Sascha Geschrieben 9. März 2014 Melden Share Geschrieben 9. März 2014 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 Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Erdnussknacker Geschrieben 9. März 2014 Autor Melden Share Geschrieben 9. März 2014 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 More sharing options...
Sascha Geschrieben 9. März 2014 Melden Share Geschrieben 9. März 2014 Ach ja, muss forward * speed heißen, nicht forward * sprint. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Erdnussknacker Geschrieben 9. März 2014 Autor Melden Share Geschrieben 9. März 2014 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 More sharing options...
Sascha Geschrieben 9. März 2014 Melden Share Geschrieben 9. März 2014 Ach soo, Verschattung. Okay, das hatte ich übersehen ^^ Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Erdnussknacker Geschrieben 9. März 2014 Autor Melden Share Geschrieben 9. März 2014 Das nach vorne Laufen funktioniert wunderbar, aber beim Stehen läuft auch die Rückwärts-Animation. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
malzbie Geschrieben 9. März 2014 Melden Share Geschrieben 9. März 2014 Welcher Wert wurde denn an den Animator übergeben und wie hast du dedn Wechsel von idle zu walk geschaltet? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Erdnussknacker Geschrieben 9. März 2014 Autor Melden Share Geschrieben 9. März 2014 Welcher Wert wurde denn an den Animator übergeben Beim nach vorne Gehen "0.5", beim nach vorne Sprinten "1", beim rückwärts Gehen "-0.5" und beim rückwärts Sprinten "-1". Beim stehen ist der Wert "-0.5". Meinst du den Wechsel im Animator? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
malzbie Geschrieben 9. März 2014 Melden Share Geschrieben 9. März 2014 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". Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Erdnussknacker Geschrieben 9. März 2014 Autor Melden Share Geschrieben 9. März 2014 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 More sharing options...
Mark Geschrieben 10. März 2014 Melden Share Geschrieben 10. März 2014 int animVertical = vertical > 0 ? 1 : vertical < 0 ? -1 : 0; Sieht nach Math.Sign/Mathf.Sign aus Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 10. März 2014 Melden Share Geschrieben 10. März 2014 *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 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 More sharing options...
Erdnussknacker Geschrieben 10. März 2014 Autor Melden Share Geschrieben 10. März 2014 Sehr lesbar ist die aktuelle Lösung aber nicht, ich würde mindestens noch die ternären Ausdrücke klammern wollen. So besser? int animVertical = vertical > 0 ? 1 : (vertical < 0 ? -1 : 0); Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 10. März 2014 Melden Share Geschrieben 10. März 2014 Auf jeden Fall, auch wenn man sich über geschachtelte ternäre Ausdrücke allgemein super streiten kann Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Erdnussknacker Geschrieben 10. März 2014 Autor Melden Share Geschrieben 10. März 2014 Auf jeden Fall, auch wenn man sich über geschachtelte ternäre Ausdrücke allgemein super streiten kann Die eine Zeile wird schon niemanden umbringen. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 10. März 2014 Melden Share Geschrieben 10. März 2014 Das sagst du jetzt noch Ne, geht aber. Mache ich auch manchmal. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.