Jump to content
Unity Insider Forum

Objekt soll smooth Schweben


Berlin-Koeln

Recommended Posts

Hey, ich bin noch blutiger Anfänger. Ich habe ein Objekt, welche "sanft" schweben soll. Es soll also immer leicht hoch und runter schweben. Ganz simpel hab ich gedacht. Habe es mit Vector3.Lerp probiert. Aber damit bewegt er sich das Objekt sehr ruckartig hoch und wird dann langsamer. Wenn es oben ist, bewegt es sich wieder ruckartig runter und wird langsamer. Kennt jemand einen Trick, mit dem sich das Objekt Smoother bewegt?

 

public class Schweben : MonoBehaviour
{
    private Vector3 position;
    private Vector3 PosA;
    private Vector3 PosB;
    private bool up = true;
    float distance;
    // Start is called before the first frame update
    void Start()
    {
        position = this.transform.position;
        PosA = position + new Vector3(0, 2, 0);
        PosB = position + new Vector3(0, -2, 0);

    }

    private void Update()
    {

        if (up)
        {
            transform.position = Vector3.Lerp(transform.position, PosA, Time.deltaTime);
            distance = Vector3.Distance(transform.position, PosA);
            if (distance <1)
            {
                up = false;
            }
        }
        else
        {
            transform.position = Vector3.Lerp(transform.position, PosB, Time.deltaTime);
            distance = Vector3.Distance(transform.position, PosB);
            if (distance < 1)
            {
                up = true;
            }
        }
        
    }
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Moin!

Das klingt mir nach einem Anwendungsfall für eine Sinuskurve. Du steckst eine in jedem Frame weiter steigende Zahl in die Mathf.Sin-Methode und kriegst eine sanft oszillierende Zahl wieder heraus. So als Beispiel:

private Vector3 originalPosition;

private void Awake()
{
  originalPosition = transform.position;
}

private void Update()
{
  var pos = originalPosition;
  pos.y += Mathf.Sin(Time.time) * 2;
  transform.position = pos;
}

Da wir den Wert der Sinuskurve immer auf die ursprüngliche Position draufaddieren müssen (und nicht auf die aktuelle), wird die ursprüngliche Position einmal gespeichert. Dann wird der Original-Vektor in Update kopiert und der Y-Wert abgeändert, indem eben der Sinuskurvenwert dazu addiert wird. Die *2 habe ich aus deinem Code übernommen; Sinuskurven gehen ja von -1 bis 1, wenn wir das *2 rechnen, geht dein Objekt von der Ausgangsposition aus 2m nach unten und 2m nach oben. Ich benutze hier Time.time, was in jedem Update einen neuen Wert zurück gibt und die Zeit seit Anfang der Szene in Sekunden darstellt. Ein immer weiter steigender Wert eben. Wenn du die Geschwindigkeit des Objekts ändern willst, musst du Time.time in der Klammer mit einem beliebigen Wert multiplizieren.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...