Jump to content
Unity Insider Forum

2D Sidescroller Movement Problem


SyntaxTalkstoMe

Recommended Posts

Moin,

ich bin noch sehr neu was Unity anbelangt. Mein Wissen beschränkt sich hauptsächlich auf ein Tutorial von Malzbier dass ich mal durchgearbeitet hatte.

Jetzt habe ich vor einen Sidescroller zu bauen. Dieser soll auf die Physic Engine verzichten, wobei ich mir gar nicht mehr so sicher bin, ob das eine gute Idee ist. Jedenfalls hat das Problem, nichts damit zu tun.

Hier ist erstmal der Code:

void Awake()
    {
        rb2d = GetComponent<Rigidbody2D>();
        anim = GetComponent<Animator>();
        renderer = GetComponent<SpriteRenderer>();
    }

    private void Start()
    {
        facingLeft = true;
    }

    private void FixedUpdate()
    {

        moveX = Input.GetAxis("Horizontal") * speed * Time.deltaTime;

        // Nach rechts laufen

        if (Input.GetKey("d"))
        {
            facingLeft = false;
            facingRight = true;
            Flip();

            transform.Translate(moveX, 0, 0, Space.World);
            anim.SetBool("walk", true);

        }
        else
        //anim.SetBool("walk", false);

        // Nach links laufen

        if (Input.GetKey("a"))
        {
            facingLeft = true;
            facingRight = false;
            Flip();

            transform.Translate(moveX, 0, 0, Space.World);
            anim.SetBool("walk", true);
        }
        //else anim.SetBool("walk", false);

          
          
          
           private void Flip()
    {
 
        if (moveX < 0 && facingRight)
        {
            Vector3 thescale = transform.localScale;
            thescale.x *= -1;
            transform.localScale = thescale;
        }
        else if (moveX > 0 && facingLeft)
        {
            Vector3 thescale = transform.localScale;
            thescale.x *= -1;
            transform.localScale = thescale;
        }

Das ist mittlerweile ein Versuch von vielen, der aber aktuell am vielversprechensten ist.

Drücke ich "a" läuft der Charakter wie gewünscht nach links. Drücke ich allerdings "d", läuft er zwar nach rechts, allerdings geschieht kein Flip. 

Halte ich aber "a" gedrückt und dann "d", dann vollzieht er den Flip und guckt nach rechts. Ich bin mir fast sicher, dass es was mit den bools zu tun hat und dem Tastendrücken und das da irgendwas nicht so läuft wie es soll. Vermutlich ein Logikfehler.

Man habe bitte wie gesagt Nachsicht mit mir. 

 

Ich muss noch dazu sagen, dass der Charakter, sobald das Spiel beginnt, nach links schauend startet.

 

Danke im Voraus

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich sehe jetzt nicht genau, warum das nur dann funktioniert, wenn du a drückst und dann d. Aber es könnte sein, dass moveX eben zu einem gewissen Zeitpunkt einfach noch nicht kleiner 0 ist, sonder vielleicht genau 0. Dann haut nämlich deine Bedingung nicht hin.
Wenn du nur die GetAxis Werte abfragts, dann holst du die eine Beschleunigung mit rein. Denn beim Druck auf eine Taste geht der GetAxis-Wert ja nicht von irgendwas direkt auf 1 oder -1, sondern er beschleunigt auf diese Wert. Wenn er negativ war und jetzt positiv sein soll, dann wird der Wert über eine gewisse Zeit von -1 Richtung 0 gehen und dann weiter auf +1.

Außerdem solltest du nicht 2 Variablen für rechts und links nehmen wenn es nur diese 2 Richtungen gibt, sondern einfach nur eine. z.B. die für Rechts. Wenn Rechts true ist, gehts nach rechts und wenn Rechts false ist, gehts eben nach links.
Wenn du das so machst, hast du schon einmal eine mögliche Fehlerquelle ausgeschlossen.

Dann würde ich die Rechst Variable nicht beim Tastendruck setzen, sondern wenn klar ist, dass sich der Player wirklich in die entsprechende Richtung bewegt. Ja und das wäre ja bei deiner Auswertung, ob moveX größer oder kleiner 0 ist.

Also:

void Update(){
  moveX=Input.GetAxis("Horizontal");
  if(moveX >0 &&!Rechts){
    rechts=true;
    Flip();
  }
  if(moveX<0 &&Rechts){
    rechts=false;
    Flip();
  }
}
void Flip(){
  Vector3 thescale = transform.localScale;
  thescale.x*=-1;
  transform.localScale=thescale;
}

Ich habe jetzt den Code komplett aus deinem Bewegungskonstrukt raus genommen, denn du willst ja für die Anzeige des players nur wissen in welche Richtung er gucken soll. Dafür reicht GetAxis ohne weitere Multiplikation von Speed oder der deltaTime aus.
Da moveX nicht mit der 0 verglichen wird, sondern immer nur ob es kleiner oder größer als 0 ist, bleibt die Ausrichtung des Players so lange beibehalten, bis es wirklich in die andere Richtung geht. Wenn er also nach einem Lauf stehen bleibt, dann schaut er mal nach rechts und mal nach links. Je nachdem, wie die vorige Bewegungsrichtung war.
Willst du beim Stillstand eine besondere Animation einbauen, dann musst du halt auch die 0 abfragen. Aber das sind Designfragen bei denen du natürlich noch einge in den Code einbauen musst.
Sol sollte es jetzt jedenfalls erstmal gehen.


 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich hab es so getan wie du es gesagt hast. Es hat tatsächlich funktioniert. Das mit dem >= 0 z.b, hat das "flackern" gelöst. Was an sich ja auch logisch ist. Weil "0" muss ja auch abgehandelt werden.

Dann kam aber ein anderes Problem zum Vorschein. Die Bewegung hat an sich funktioniert. Aber ab und an hat er sich verhaspelt was die Richtung anbelangt. Ausgelöst wird es, wenn ich mal wirklich schnell die taste a und d drücke, also quasi ganz schnell versuche Richtungswechsel zu vollführen.  Der Code an sich funktioniert aber.

Hast du dafür eine Lösung, oder Idee wie man das vermeiden könnte?

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...