BeatenByBacon Geschrieben 2. Januar 2021 Melden Share Geschrieben 2. Januar 2021 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. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Jog Geschrieben 2. Januar 2021 Melden Share Geschrieben 2. Januar 2021 Hallo, vielleicht hilft dir das weiter https://forum.unity-community.de/topic/15748-bewegung-in-sichtrichtung-von-partikel-per-player-rotation/?do=findComment&comment=109292 Gruß Jog Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 2. Januar 2021 Melden Share Geschrieben 2. Januar 2021 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 More sharing options...
BeatenByBacon Geschrieben 2. Januar 2021 Autor Melden Share Geschrieben 2. Januar 2021 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 More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.