Jump to content
Unity Insider Forum

2D Game Blickrichtung des Charakters ändern


mrkenendie

Recommended Posts

Hallo zusammen,

 

https://www.bilder-upload.eu/bild-fcfcad-1550494014.jpg.html

ich hoffe mir kann jemand eventuell helfen. In dem Bild ist der Code mit dem ich Probleme habe:

Ich habe erst vor kurzem mit Programmieren C# und Unity angefangen. In einem Tutorial geht es darum, dass sich beim Drücken der Pfeiltasten auf der horizontalen Ebene auch der Charakter mitdreht, je nach dem ob man nach links oder rechts läuft. Dafür hat der Tutor zunächst eine Bool-Variable mit dem Namen lookingRight angelegt und ihr per Standard den Wert true zugewiesen. (public bool lookingRight = true;)

Anschließend die Funktion public void Flip, die dafür sorgt, dass sich die Scalierung des Charakters auf der x-Achse von +1 auf -1 ändert und somit der ganze Charakter gedreht wird. Soweit so gut. Jedoch wurde zusätzlich eine for-Schleife in der FixedUpdate-Funktion angelegt, die dafür sorgen soll, dass die Funktion zum richtigen Zeitpunkt aufgerufen wird, d.h. wenn die variiable hor den Wert <0 annimmt und lookingRight true ist, oder sie den Wert <O annimmt, und lookingRight false ist.

Was ich nicht verstehe ist, woher Unity nun weiß, dass der Charakter nach rechts bzw. nicht nach rechts blickt? Der &&-Operator gibt ja nur an, dass beide Bedingungen hor und lookingRight erfüllt sein müssen Aber dass der Spieler während die Pfeiltaste nach rechts gedrückt wird (hor >0) nach rechts blickt (lookingRight = true) kann Unit doch eigentlich noch garnicht wissen, oder? Wurde hier ein Schritt übersprungen? Muss nicht erst noch Unity mitgeteilt werden, dass, genau dann, wenn die Pfeiltaste nach rechts gedrückt wird der Spieler nach rechts schaut, und erst wenn die Linke Pfeiltaste gedrückt wird, die Funktion Flip aufgerufen werden soll, und umgekehrt?

 

Ich wäre für jegliche Hinweise und Hilfe dankbar.

 

Beste Grüße

Link zu diesem Kommentar
Auf anderen Seiten teilen

Moinsen!

Du kannst hier Code auch als Text einfügen, dann brauchst du kein Bild dafür machen :) Einfach über der Textbox auf den Knopf mit dem <> drücken, links neben dem Unity-Logo.

Aber zum Thema. Wir fächern diese etwas komplexe Zeile mal etwas auf.

  • lookingRight ist true, wenn der Character gerade nach rechts guckt. Das ist nichts, was Unity uns mitteilt, sondern was unser Script sich eigenständig merkt, da wir sorgfältig darauf achten, dass bei jedem Flip der Wert richtig geändert wird.
  • !lookingRight ist die Negation, also genau dann true, wenn wir gerade nach links gucken.
  • hor > 0 ist true, wenn die rechte Taste gedrückt gehalten wird.
  • hor < 0 ist entsprechend true, wenn's die linke Taste ist.
  • hor > 0 && !lookingRight ist true, wenn die rechte Taste gedrückt wird und wir gerade nach links gucken.
  • hor < 0 && lookingRight ist genau umgekehrt: true, wenn die linke Taste gedrückt wird und wir gerade nach rechts gucken.
  • Der gesamte Ausdruck in der if-Abfrage kombiniert diese letzten zwei Sachen mit ||, also oder. Der Ausdruck ergibt also true, wenn
    • (wir die rechte Taste drücken während wir nach links schauen) oder (wir die linke Taste drücken während wir nach rechts schauen)

Also anders gesagt: Wir drücken in die Richtung, in die wir gerade nicht schauen. Und genau dann ist ein Richtungswechsel, also ein Flip, angesagt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 49 Minuten schrieb Sascha:

Moinsen!

Du kannst hier Code auch als Text einfügen, dann brauchst du kein Bild dafür machen :) Einfach über der Textbox auf den Knopf mit dem <> drücken, links neben dem Unity-Logo.

Aber zum Thema. Wir fächern diese etwas komplexe Zeile mal etwas auf.

  • lookingRight ist true, wenn der Character gerade nach rechts guckt. Das ist nichts, was Unity uns mitteilt, sondern was unser Script sich eigenständig merkt, da wir sorgfältig darauf achten, dass bei jedem Flip der Wert richtig geändert wird.
  • !lookingRight ist die Negation, also genau dann true, wenn wir gerade nach links gucken.
  • hor > 0 ist true, wenn die rechte Taste gedrückt gehalten wird.
  • hor < 0 ist entsprechend true, wenn's die linke Taste ist.
  • hor > 0 && !lookingRight ist true, wenn die rechte Taste gedrückt wird und wir gerade nach links gucken.
  • hor < 0 && lookingRight ist genau umgekehrt: true, wenn die linke Taste gedrückt wird und wir gerade nach rechts gucken.
  • Der gesamte Ausdruck in der if-Abfrage kombiniert diese letzten zwei Sachen mit ||, also oder. Der Ausdruck ergibt also true, wenn
    • (wir die rechte Taste drücken während wir nach links schauen) oder (wir die linke Taste drücken während wir nach rechts schauen)

Also anders gesagt: Wir drücken in die Richtung, in die wir gerade nicht schauen. Und genau dann ist ein Richtungswechsel, also ein Flip, angesagt.

Hallo Sascha,

 

vielen Dank für deine Antwort, und den vielen Erklärungen dazu. Das mit dem Code als Text einfügen, merke ich mir aufjedenfall.

Ich habe allerdings immer noch das Problem, dass ich nicht verstehe, woher das Script bzw. Unity weiß, dass der Charakter gerade nach rechts schaut? Müsste ich nicht erst definieren, dass lookingRight bedeutet, dass das Spielerobjekt r2b2 auf der x-achse der Skalierung einen Wert von +1 aufweist und halt solange true sein soll bis die linke pfeiltaste betätigt wird?

 

public class PlayerControler : MonoBehaviour
{
    public float maxSpeed =4;
    public float jumpForce = 550;

    public bool lookingRight = true;
    private Rigidbody2D rb2b;
    private Animator anim;
    
    // Start is called before the first frame update
    void Start()
    {
        rb2b = GetComponent<Rigidbody2D>();
        anim = GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update()
    {

    }

    void FixedUpdate()
    {


        float hor = Input.GetAxis("Horizontal");   
        
        
        rb2b.velocity = new Vector3(hor * maxSpeed, rb2b.velocity.y);

        if ((hor > 0 && !lookingRight) || (hor < 0 && lookingRight))
            Flip();
    }


    public void Flip()
    {
        lookingRight = !lookingRight;                      
        Vector3 myScale = rb2b.transform.localScale;     
        myScale.x *= -1;                                 
        rb2b.transform.localScale = myScale;              
    }

}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Unity weiß gar nichts. Deine Figurengrafik sollte bei diesem Script nach rechts schauen, und wenn sie dann gespiegelt wird, schaut sie nach links. wenn lookingRight false wird, wird gespiegelt, und sonst nicht. Darüber hinaus gibt es da keine Verbindung zwischen deiner bool-Variable und deiner Figur.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 2 Stunden schrieb Sascha:

Unity weiß gar nichts. Deine Figurengrafik sollte bei diesem Script nach rechts schauen, und wenn sie dann gespiegelt wird, schaut sie nach links. wenn lookingRight false wird, wird gespiegelt, und sonst nicht. Darüber hinaus gibt es da keine Verbindung zwischen deiner bool-Variable und deiner Figur.

Ich hab es jetzt endlich kapiert^^ Mein Denkfehler war, dass ich nicht genau wusste, was ich mit

public void Flip()
    {
        lookingRight = !lookingRight;

anfangen sollte. Von true auf false und umgekehrt wird ja erst gewechselt, wenn die Funktion aufgerufen wird und ihre Arbeit verrichtet. lookingRight ist mit dem Starten des Spiels true, Wenn ich nun nach rechts drücke (h>0) ist die Bedingung zum Einsetzen der Flip-Funktion nicht erfüllt. Wenn ich nach links drücke dann sind beide Bedingungen erfüllt (lookingright ist (immer noch) true und h<0, also Flip-Funktion. Dadurch wird x bei der Scalierung mit minus 1 multipliziert, der Charakter ändert seine Blickrichtung, x ist <0, und lookingRight ist false, und das Spiel beginnt von neuem, wenn ich jetzt die rechte Taste wieder drücke.

 

Danke dir Sascha.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...