Jump to content
Unity Insider Forum
BeatenByBacon

Position Relativ von Spieler ändern

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

Share this post


Link to post
Share on other sites

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.

  • Like 1

Share this post


Link to post
Share on other sites

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));
        }
           
    }

 

  • Like 1

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...