Jump to content
Unity Insider Forum

Bei Bewegung leichtes "Kippen" simulieren


noobee

Recommended Posts

Hallo @ community,

ich teste mich seit wenigen Wochen an Unity aus. Bisher läuft alles recht holprig, aber es läuft :)

Zu meiner Frage:
Ich habe mir nun eine Plattform erstellt. Diese kann ich nur nach links/rechts bewegen(ist so gewollt) .

public static Vector2 PlayerPosition;
PlayerPosition = new Vector2(transform.position.x + fmoveSpeed * Time.deltaTime, transform.position.y + fscrollSpeed * Time.deltaTime)

Funktioniert ohne Probleme. Jedoch möchte ich, dass bei einer Bewegung nach links/rechts die Plattform nun ein winziges bisschen kippt. Ist das in einem 2D Spiel möglich? Ich nutze ja auch nur den Vector2 nicht Vector3 ?!?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ok, also kann ich "einfach" nen Vector3 draus machen und bei "z" nen Winkel eintragen? Sprich also so:

PlayerPosition = new Vector3(transform.position.x + fmoveSpeed * Time.deltaTime, transform.position.y + fscrollSpeed * Time.deltaTime, transform.position.z  - 60f* Time.deltaTime)

wobei das "transform.position.z  - 60f * Time.deltaTime" eine Rotation in der z-Achse sein soll um 60°? Leider passiert da bei mir nichts 🙄

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nee. Drehen tut man über rotation oder über eulerAngles nicht über position!

https://docs.unity3d.com/ScriptReference/Transform-eulerAngles.html

Und immer dran denken, du machst da kein Vector3 draus. Das ist ein Vector3 denn der Raum ist und bleibt 3-Dimensional!
Wenn du die Spriteposition mit Vector2 bestückst, wird einfach nur die Z Achse außen vor gelassen. Die ändert man idR. auch nicht, da alles bei einem 2D Game auf einer Ebene abläuft.
Um ein Sprite vor ein anderes Sprite zu bekommen ändert man auch nichts an der Z-Position (also der Tiefe im Raum) sondern an der Sortierung, die du im SpriteRenderer einstellst.
Aber natürlich kann man die Sprites auch in der Tiefe arrangieren. Dann werden (wenn alle Sprites die gleiche Sortierung haben) die Spirtes, die näher an der Camera sind, vor den anderen gezeichnet. Das ist sinnvoll, wenn gewisse Objekte immer im Hintergrund bleiben sollen.

https://docs.unity3d.com/Manual/class-SpriteRenderer.html

Du hast doch anfänglich von einer leichten Drehung gesprochen. 60° sehe ich nicht mehr als leichte Drehung an! :D
Was willst du denn machen?


 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja, 60° ist keine leichte Drehung 🤪 wenn ich eine Drehung von 5° eingestellt hätte, hätte ich denn Effekt vllt nicht gesehen will er so klein wäre.

 

Was ich machen will? Ich habe eine Plattform, die ich nach Links und rechts bewegen kann. Immer wenn ich left bzw right drücke, soll die Plattform sanft ganz leicht in die entsprechende Richtung "kippen/wippen"... eben um die 5°

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das soll also sofort passieren (natürlich weich, über eine kurze Zeit) und dann bei 5° stehen bleiben?
Warum animierst du dann nicht einfach die Plattform? Du brauchst dafür nur 4 kleine Animationen. Je Richtung eine die von waagerecht nach leicht gekippt geht. Und das vielleicht über eine viertel Sekunde. Und dann natürlich für jede Richtung zurück von gekippt zu waagerecht.
Du könntest dir die ganze Programmierung sparen und einfach den Animator für dich arbeiten lassen. Der müsste nur wissen, ob und welche Taste gerade gedrückt wurde. Das kannst du mit 2 Boolschen Steuervariablen machen. Eine für links und eine für rechts. Ist keine Taste gedrückt sind beide false. Ist eine Taste gedrückt wird die Variable für diese Richtung auf true gesetzt und die Andere auf false. Du hast einen Idle State, wo keine Animation abgespielt wird. In den beim Start des Spiels rein gesprungen wird. Von dort aus geht es zu den 2 Kippanimationen. In den Transitions stellst du ein dass die entsprechende Richtung true sein soll. Von der Kippanimation geht es zur Animation die die Plattform wieder waagerecht werden lässt, wenn die Richtungsvariable false ist. Ja und von dieser Rückstellanimation geht es einfach zum Idle sobald die Animation fertig ist.

Nur so ne Idee. :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo noobee,

du hast doch den Wert deiner Bewegung "fmoveSpeed" und "fscrollSpeed ".

Wenn du dir nun einen float "rotationMultiplyer" machst und dann die gewünschte Achse einfach um z.B.: fmoveSpeed * rotationMultiplyer drehst sollte das ziemlich simpel gehen.

Ein Beispiel,
sagen wir links = -1 fmoveSpeed und rechts = 1 fmoveSpeed
der rotationMultiplyer = 5; // du willst ja 5°

public Vector2 PlayerPosition;
public Transform Player;
public float SmoothTime = 0.05F;
public float RotationMultiplyer = 5; 
public Vector3 StartRotation;

// Bei der Initialisierung (z.B.: in Start oder Awake)
StartRotation = Player.localRotation.eulerAngles;

// Hier dann wieder in z.B: Update
// Das kennst du ja:
PlayerPosition = new Vector2(transform.position.x + fmoveSpeed * Time.deltaTime, transform.position.y + fscrollSpeed * Time.deltaTime)

// je nachdem welche Achse du drehen möchtest muss das natürlich an die richtige Stelle
Vector3 rot = StartRotation + new Vector3(0, 0, fmoveSpeed * RotationMultiplyer);

// hier passen wir die Rotation dann schön "soft" an:
Player.localRotation = Quaternion.Lerp(Player.localRotation, Quaternion.Euler(rot), SmoothTime);

Ich hab das jetzt nicht getestet, aber zumindest als Ansatz sollte es dienen.

Herzliche Grüße,
Daniel (ProjectMakers)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...