Jump to content
Unity Insider Forum

Position Relativ von Spieler ändern


BeatenByBacon

Recommended Posts

Hey Unity-Community.

Erstmal ein frohes neues Jahr.

Ich habe aktuell ein Problem bei dem ich nicht weiter komme.

Ich programmiere ein 2D Top-Down Roguelite-Spacegame. Der Spieler soll die Möglichkeit haben, ziemlich wendig durch das Level zu flitzen.

 Mein momentanes Problem ist nun folgendes: Ich möchte, das der Spieler sich per "Barrel Roll" abhängig von seiner Position bzw. Rotation nach rechts / links bewegen soll.

Mein Ansatz wäre folgender: Wenn der Spieler zB. gerade nach oben Positioniert ist (Bild 1), soll er über die Tastenkombination Strg + A seine Position auf der X-Achse  verschieben. Seine Koordinaten wären vom Startpunkt (0,0) dann zB. (1,0).

Wenn der Spieler jedoch geneigt ist (Bild 2), sagen wir mal 45°, und dann nach links "rollen" will, wäre die Position vom Startpunkt (0,0) dann (-1,-1). 

Ich vermute es hat irgendwas mit localRotation zu tun, nur wüsste ich nicht wie mein Problem in Code geschrieben werden kann.

Auch habe ich etwas über InverseTransformPoint herausgefunden. Das soll die lokale Position aus der globalen konvertieren.

    public Rigidbody2D rb;
    public float speed = 100;
    public float rotation = 0;
    public float rotSpeed = 0.01f;
    public float barrelRollDistance = 0.5f;
    Quaternion currentAngle;
    
    void Update()
    {
		/////////
		//BarrelRoll nach links abhaengig von aktuellen spieler position+rotation
		/////////
        if (Input.GetKey(KeyCode.A) && Input.GetKey(KeyCode.LeftControl))
        {
            BarrelRoll(-1);
        }
        else if (Input.GetKey(KeyCode.A))
            ChangeRotation(-1);

		/////////
		//BarrelRoll nach rechts abhaengig von aktuellen spieler position+rotation
		/////////
        if (Input.GetKey(KeyCode.D) && Input.GetKey(KeyCode.LeftControl))
        {
            BarrelRoll(1);
        }
        else if (Input.GetKey(KeyCode.D))
            ChangeRotation(1);

        ChangeRotation(0);
           transform.rotation = Quaternion.Slerp(transform.rotation, currentAngle, rotSpeed);
        if (Input.GetKey(KeyCode.W))
            ThrustForward();

    }

    //Movement of the Player
    void ThrustForward()
    {
        rb.AddForce(transform.up * speed);
    }

    //Rotation of the player
    void ChangeRotation(int value)
    {
        if (value < 0)
            rotation++;
        else if(value > 0)
            rotation--;
        currentAngle = Quaternion.Euler(0, 0, rotation * rotSpeed);
    }

    /////////
    //Methode zum Rollen des Spielers
    /////////
    void BarrelRoll(int value)
    {
        if (value < 0)
        {
            Vector3 pos = transform.InverseTransformPoint(transform.position.x + barrelRollDistance, transform.position.y, transform.position.z);
            transform.position = pos;
        }
        else if (value > 0)
        {

        }
           
    }

Falls mir jemand helfen kann, wäre das fantastisch :)

Ich bedanke mich schonmal im voraus.

 

Screenshot (132)_LI.jpg

Screenshot (131)_LI.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mit Transform.InverseTransformPoint hast du schon fast das Richtige gefunden. Transform.TransformDirection sollte da eher passen.

Du kannst aber auch schön stumpf mit Transform.right arbeiten. Das ist einfach der Vektor, der zur rechten Seite des Objekts zeigt. Ein Minus davor und du hast die linke Seite.

Da du mit einem Rigidbody arbeitest, kann Rigidbody.AddForceRelative (siehe @Jogs Post) natürlich auch gut funktionieren.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das ist genau das was ich gesucht habe @Jog

Vielen Dank für die Hilfe :)

Danke auch dir @Sascha. Werde zwischen beiden möglichkeiten etwas herumspielen bis es das ist, was am besten passt

Für alle nachfolgenden die es interessieren könnte, so sieht der aktuell angepasste Code für mein Problem aus:

    void BarrelRoll(int value)
    {
        if (value < 0)
        {
            rb.AddRelativeForce(new Vector2(-barrelRollDistance, 0));
        }
        else if (value > 0)
        {
            rb.AddRelativeForce(new Vector2(barrelRollDistance, 0));
        }
           
    }

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...