Ich habe ein Projekt in Einheit 3D gestartet. Ich möchte ein Raumschiff bauen, das sich vorwärts bewegt, aber wenn ich den Pfeil nach oben drücke, möchte ich seine y-Position in (currentpos + 1.5) ändern, aber ich möchte dies reibungslos. Das ist mein Code

transform.position += transform.forward * Time.deltaTime * 10f;

if (Input.GetKey (KeyCode.UpArrow))
transform.position = new Vector3 (transform.position.x, 5f, 
transform.position.z);

Durch den obigen Code kann die Y-Position des Objekts geändert werden, aber es funktioniert so schnell und ich möchte es glatt machen. Also bitte hilf mir.

0
Faisalmirza Mirza 19 Jän. 2019 im 12:38

3 Antworten

Beste Antwort

Ich denke, die beste Lösung für Ihr Problem ist die Verwendung von Mathf.SmoothDamp.

Beispiel:

private float targetY = 0f;
private float verticalVelocity = 0f;
private const float smoothTime = 1f;

private void Update()
{
    transform.position += transform.forward * Time.deltaTime * 10f;

    if (Input.GetKey(KeyCode.UpArrow))
    {
        targetY = 5f;
    }

    float y = Mathf.SmoothDamp(transform.position.y, targetY, ref verticalVelocity, smoothTime);
    transform.position = new Vector3 (transform.position.x, y, transform.position.z);

}

In diesem Beispiel wird die y -Koordinate im Verlauf von 1 Sekunde problemlos auf 5 geändert (Sie können die smoothTime -Konstante für eine andere Zeit ändern).

1
Julxzs 19 Jän. 2019 im 14:32

Basierend auf Ihrem eigenen Code könnte der einfachste Weg für Sie sein, dies herauszufinden

//this sets the X position
transform.position += transform.forward * Time.deltaTime * 10f;

//if the button is pressed then modify Y
if (Input.GetKey (KeyCode.UpArrow))
    transform.position += new Vector3 (0, 5f  * Time.deltaTime * y_speed,0);

y_speed kann ein public float y_speed = 1.0f in Ihrem Skript sein, sodass Sie es im Inspektor ändern können, um den gewünschten Effekt zu erzielen.

Ich hoffe es hilft!

1
Chopi 19 Jän. 2019 im 10:15

Angenommen, Ihr Raumschiff ist ein starrer Körper, sollten Sie sich Rigidbody.AddForce ansehen https://docs.unity3d.com/ScriptReference/Rigidbody.AddForce.html

Wenn Sie mit Kräften arbeiten, können Sie sehr einfach eine reibungslose Bewegung in alle Richtungen erzielen und diese innerhalb der Rigidbody-Parameter (wie Masse) anpassen, ohne erneut im Skript herumzuspielen. Es ist Teil des Unity-Physikmodells.

Wenn Sie sich nur in y-Richtung bewegen möchten, geben Sie einen Vektor wie (0,1,0) ein, aber Sie können auch den Transform.forward-Vektor des Gameobjects Ihres Raumschiffs eingeben. Auf diese Weise bewegt es sich immer in die Richtung, in die es zeigt.

0
Commodore Yournero 19 Jän. 2019 im 10:33