2017-12-23 4 views
2

Ich bin neu in Unity und benutze CharacterController.Move, um meinen Charakter zu bewegen. In meiner Spielwelt ist 1 Einheit = 1 Meter. Das funktioniert super, zum Beispiel für Geschwindigkeit: Wenn ich eine Geschwindigkeit von 5 verwende, hat der Charakter eine Geschwindigkeit von 5m/s.Sprunghöhe und Schwerkraft in Einheit

Ich mache meinen Charakter Sprung mit:

if (Input.GetButton("Jump")) 
moveDirection.y = jumpHeight; 
... 
moveDirection.y -= gravity * Time.deltaTime; 

Dies funktioniert auch in Ordnung, aber da die Schwerkraft nach unten meinem Charakter zieht, wird die jumpHeight nicht wirklich erreicht. Zum Beispiel ergibt ein jumpHeight von 8 einen Sprung von etwas rund 2,4 Metern.

Wie kann ich meinen Code ändern, so dass jumpHeight die Höhe darstellt, in der der Charakter springt, auch wenn die Schwerkraft ihn runterzieht? Mit einem Sprung von 8 möchte ich, dass mein Spieler einen Sprung von 8 Metern macht.

Laut der Physik wäre die Höhe mit einer Anfangsgeschwindigkeit von 8 1,6 mit einer Schwerkraft von 20 (height = initialvelocity^2/(2*gravity)). Wenn dies tatsächlich die Höhe wäre, die ich im Spiel sehe, könnte ich die Formel einfach umwandeln, aber ich sehe eine Höhe von etwa 2,4 Metern ...

+0

Haben Sie sich Gedanken über irgendeine Lösung mit vector3.slerp ? – Asbest

Antwort

0

Sie sind auf dem richtigen Weg. Ich nehme an, Sie kennen die SUVAT-Gleichungen.

Unsere bekannten können sprungsprung (8) und timeToJumpApex (0.5f) < - Sie können dies zu was auch immer ändern, aber 0.5f ist ein guter Anfang.

Die Zeit zum Springen der Spitze ist, wie der Name andeutet, die Zeit, die benötigt wird, um die Spitze eines Sprunges zu treffen.

Wir müssen jetzt für die verbleibenden Variablen, Schwerkraft und Sprunggeschwindigkeit lösen. Gravity können als solche definiert werden:

gravity = 2 * jumpheight/timeToJumpApex^2; 

Jump Geschwindigkeit können als solche definiert werden:

jumpVelocity = gravity * timeToJumpApex; 

Dann können Sie tun:

if (Input.GetButton("Jump")) 
moveDirection.y = jumpVelocity; 
... 
moveDirection.y -= gravity * Time.deltaTime;