Jump to content
Unity Insider Forum

Bewegungsscript


wueschn

Recommended Posts

Werte Profis 

Ich habe aus einem Tutorial folgendes Bewegungsscript übernommen, es funktioniert, aber ich verstehe es nicht.

Was wird genau in den Variablen xEingabe und yEingabe gespeichert?

 

public class Player : MonoBehaviour {

    float eingabeFaktor = 10;

	void Update () {

        //Eingabe speichern
        float xEingabe = Input.GetAxis("Horizontal");
        float yEingabe = Input.GetAxis("Vertical");

        //neue Position bestimmen
        float xNeu = transform.position.x + xEingabe * eingabeFaktor * Time.deltaTime;
      
        float yNeu = transform.position.y + yEingabe * eingabeFaktor * Time.deltaTime;
      
        transform.position = new Vector3(xNeu, yNeu, 0);

    }
}

Warum bewirkt diese Anweisung eine Bewegung in X-Richtung?

loat xNeu = transform.position.x + xEingabe * eingabeFaktor * Time.deltaTime;

Vielen Dank vorab

wueschn

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das ist so, weil:
transform.position.x ist die Position des Objektes auf der X Achse des Raumes. Welcher Wert das gerade ist, kannst du im Inspector oben rechts sehen, wenn du das Objekt in dr Szene angeklickt hast. 
Eine Bewegung im Raum auf der X Achse ist ja eigentlich immer nur ein Setzen auf einen gewissen Punkt. Und das passiert bei jedem Bild was gerendert wird.
Wenn dein Computer bei deinem Spiel 60 Bilder pro Sekunde schafft, dann wird das Objekt auch 60 mal Pro Sekunde auf eine gewisse Position gesetzt. Ändert sich der Wert, wie z.B. in dem Script, so sieht es für dich so aus, als bewegt sich das Objekt sanft im Raum z.B. nach rechts. Aber eigentlich wurde bei jedem Frame die Position manipuliert. Im ersten Bild war die Position auf der 1 und im zweiten Bild ist sie auf der 2. usw. ! Es gibt nichts zwischen den Bildern und somit ist das auch keine Bewegung an sich. Sie läuft aber schnell genug ab, damit du das glaubst.

Die Werte von transform.position kann man auslesen und auch beschreiben. Und das wird in deinem Code gemacht.
xNeu ist eine Variable in die der Wert der jetzigen x-Position deins Objektes rein gespeichert wird. Zusätzlich wird zu diesem Wert ein 2ter Wert addiert.
Der 2te Wert ist eine Multiplikation von der xEingabe und der deltaTime.
xEingabe ist eine Variable, die ihren Wert weiter oben im Code von Input.GetAxis("Horizontal") bekommt. Das Input-Modul fragt alle möglichen Eingabegeräte wie die Tastatur und Joysticks ab. GetAxis("Horizontal") ist eine Explizite abfrage von einer JoysickAchse oder aber von vorher definierten Links- undRechts-Tasten, auf der Tastatur. Wird in keine Richtung gelenkt, dann kommt der Wert 0 zurück. Wird aber nach Rechts gelenkt, kommt ein Wert zurück der größer 0 ist. Der Maximalausschlag ist 1. In die andere Richtung wird der Wert negativ und hat einen Maximalwert von -1.

deltaTime ist ein Zeitwert, der dir anzeigt, wieviel Zeit zwischen 2 Frames vergangen ist. Der dient dazu um auf allen Rechnern die gleiche "Geschwindigkeit" im Spiel zu bekommen. Bei einem Rechner wo 60 frames funktionieren, wäre der Wert 1/60sec. Bei einem Rechner der nur 30 frames schafft, wäre er 1/30sec. also doppelt so groß. Da mit diesen Werten multipliziert wird, ist es egal, wie schnell der Rechner ist, das Objekt würde in einer Sekunde bei beiden Rechnern gleich weit gekommen sein.

So:
xNeu bekommt jetzt also die alte Position des Objektes plus einen recht kleinen Wert (xEingabe * Time.deltaTime) hinzu, der entweder positiv oder negativ ist, je nachdem ob du nach links oder nach rechts lenkst. Dieser neue Wert wird weiter unten im Code jetzt der Transformkomponente übergeben. Also die alten Werte werden mit den neuen Werten aus xNeu und yNeu überschrieben. Und schwupps steht das Objekt jetzt an einer etwas anderen Position.
Das passiert jedes Frame.
Es wird geschaut wo hin gelenkt wird und wo das Objekt jetzt gerade ist. Dann wird ein bisschen was addiert und multipliziert und dem Objekt gesagt, wo es nun zu stehen hat.
Wird nicht gelekt, kommt eine 0 zurück und dann bewegt sich das Objekt eben nicht. Denn alte Position  plus 0 ist immer noch alte Position.

So funktioniert das. :)


 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Um nochmals sicher zu gehen: 

 float eingabeFaktor = 10;
float xEingabe = Input.GetAxis("Horizontal");
     
float xNeu = transform.position.x + xEingabe * eingabeFaktor * Time.deltaTime;

xEingabe ist im Prinzip immer ein Wert zwischen 0 und 1 bzw. 0 und -1 und dieser Wert mal 10 mal die Framezeit Time.deltaTime ergibt die ÄNDERUNG, die zur aktuellen Position dazugezählt wird?

Danke nochmals

Mario

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...