Erdnussknacker Posted March 7, 2014 Report Share Posted March 7, 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 to comment Share on other sites More sharing options...
Sascha Posted March 7, 2014 Report Share Posted March 7, 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 to comment Share on other sites More sharing options...
Erdnussknacker Posted March 7, 2014 Author Report Share Posted March 7, 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 to comment Share on other sites More sharing options...
AgentCodeMonk Posted March 7, 2014 Report Share Posted March 7, 2014 guckst nach ternären operatoren Link to comment Share on other sites More sharing options...
Erdnussknacker Posted March 7, 2014 Author Report Share Posted March 7, 2014 guckst nach ternären operatoren Danke sehr, die Entwickler machen da ja super Videos zu. Link to comment Share on other sites More sharing options...
Sascha Posted March 8, 2014 Report Share Posted March 8, 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 to comment Share on other sites More sharing options...
Erdnussknacker Posted March 8, 2014 Author Report Share Posted March 8, 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 to comment Share on other sites More sharing options...
Sascha Posted March 9, 2014 Report Share Posted March 9, 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 to comment Share on other sites More sharing options...
Erdnussknacker Posted March 9, 2014 Author Report Share Posted March 9, 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 to comment Share on other sites More sharing options...
Sascha Posted March 9, 2014 Report Share Posted March 9, 2014 Ach ja, muss forward * speed heißen, nicht forward * sprint. Link to comment Share on other sites More sharing options...
Erdnussknacker Posted March 9, 2014 Author Report Share Posted March 9, 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 to comment Share on other sites More sharing options...
Sascha Posted March 9, 2014 Report Share Posted March 9, 2014 Ach soo, Verschattung. Okay, das hatte ich übersehen ^^ Link to comment Share on other sites More sharing options...
Erdnussknacker Posted March 9, 2014 Author Report Share Posted March 9, 2014 Das nach vorne Laufen funktioniert wunderbar, aber beim Stehen läuft auch die Rückwärts-Animation. Link to comment Share on other sites More sharing options...
malzbie Posted March 9, 2014 Report Share Posted March 9, 2014 Welcher Wert wurde denn an den Animator übergeben und wie hast du dedn Wechsel von idle zu walk geschaltet? Link to comment Share on other sites More sharing options...
Erdnussknacker Posted March 9, 2014 Author Report Share Posted March 9, 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 to comment Share on other sites More sharing options...
malzbie Posted March 9, 2014 Report Share Posted March 9, 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 to comment Share on other sites More sharing options...
Erdnussknacker Posted March 9, 2014 Author Report Share Posted March 9, 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 to comment Share on other sites More sharing options...
Mark Posted March 10, 2014 Report Share Posted March 10, 2014 int animVertical = vertical > 0 ? 1 : vertical < 0 ? -1 : 0; Sieht nach Math.Sign/Mathf.Sign aus Link to comment Share on other sites More sharing options...
Sascha Posted March 10, 2014 Report Share Posted March 10, 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 to comment Share on other sites More sharing options...
Erdnussknacker Posted March 10, 2014 Author Report Share Posted March 10, 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 to comment Share on other sites More sharing options...
Sascha Posted March 10, 2014 Report Share Posted March 10, 2014 Auf jeden Fall, auch wenn man sich über geschachtelte ternäre Ausdrücke allgemein super streiten kann Link to comment Share on other sites More sharing options...
Erdnussknacker Posted March 10, 2014 Author Report Share Posted March 10, 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 to comment Share on other sites More sharing options...
Sascha Posted March 10, 2014 Report Share Posted March 10, 2014 Das sagst du jetzt noch Ne, geht aber. Mache ich auch manchmal. Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.