Die meisten Beispiele gibt, einschließlich Unity Beispiele aus ihrer offiziellen Website Lerp in die falsche Art und Weise verwenden. Sie haben sich nicht einmal die Mühe gemacht zu beschreiben, wie es in der API-Dokumentation funktioniert. Sie stärken es einfach in der Update()
Funktion und nennen es einen Tag.
Mathf.Lerp
, Vector3.Lerp
und Quaternion.Slerp
Arbeit von einer Position/Dreh zum anderen ändert mit dem t Wert (letzter Parameter) in.That t Wert übergeben wird, ist auch als Zeit kennen.
Die min des t Wert 0F und der max ist 1f.
Ich werde dies mit Mathf.Lerp
erklären, um es leichter zu verstehen. Die Lerp
Funktionen sind alle gleich für Mathf.Lerp
, Vector
und Quaternion
.
Denken Sie daran, dass Lerp
zwei Werte akzeptiert und Werte zwischen ihnen zurückgibt. Wenn wir einen Wert von und haben und wir tun Lerp auf sie:
float x = Mathf.Lerp(1f, 10f, 0f); will return 1.
float x = Mathf.Lerp(1f, 10f, 0.5f); will return 5.5
float x = Mathf.Lerp(1f, 10f, 1f); will return 10
Wie Sie sehen können, gibt die t(0)
die min der Zahl übergeben, t(1)
gibt den max Wert übergeben und t(0.5)
wird Mitte Punkt zwischen dem min und dem max Wert zurückgegeben. Sie tun es falsch, wenn Sie einen t Wert übergeben, der < 0
oder > 1
ist. Dieser Code in dir Update()
Funktion macht genau das. Time.time
wird jede Sekunde erhöht und wird > 1
in einer Sekunde sein, so dass Sie Probleme damit haben.
Es wird empfohlen, Lerp
in einer anderen Funktion/Coroutine anstelle der aktualisierten Funktion zu verwenden.
Hinweis:
Lerp
Verwendung hat eine schlechte Seite davon, wenn es um Rotation kommt. Lerp
kann nicht Objekt mit dem kürzesten Pfad drehen. Denken Sie also daran. Zum Beispiel haben Sie ein Objekt mit 0,0,90
Position. Nehmen wir an, Sie möchten die Rotation von dieser auf 0,0,120
Lerp
verschieben kann manchmal links statt rechts drehen, um diese neue Position zu erreichen, was bedeutet, dass es länger dauert, um diese Entfernung zu erreichen.
Nehmen wir an, wir wollen die Rotation (0,0,90)
von was auch immer die aktuelle Rotation ist. Der folgende Code ändert die Drehung in 0 Sekunden in 0,0,90
.
ROTATION ZEIT:
void Start()
{
Quaternion rotation2 = Quaternion.Euler(new Vector3(0, 0, 90));
StartCoroutine(rotateObject(objectToRotate, rotation2, 3f));
}
bool rotating = false;
public GameObject objectToRotate;
IEnumerator rotateObject(GameObject gameObjectToMove, Quaternion newRot, float duration)
{
if (rotating)
{
yield break;
}
rotating = true;
Quaternion currentRot = gameObjectToMove.transform.rotation;
float counter = 0;
while (counter < duration)
{
counter += Time.deltaTime;
gameObjectToMove.transform.rotation = Quaternion.Lerp(currentRot, newRot, counter/duration);
yield return null;
}
rotating = false;
}
Inkremental-Dreh ROTATION ZEIT:
Und drehen Sie einfach das Objekt bis 90 in z-Achse ist der Code unter einem großartiges Beispiel dafür, dass . Bitte beachten Sie, dass es einen Unterschied zwischen dem Bewegen des Objekts zu einem neuen Drehpunkt und dem bloßen Drehen gibt.
void Start()
{
StartCoroutine(rotateObject(objectToRotate, new Vector3(0, 0, 90), 3f));
}
bool rotating = false;
public GameObject objectToRotate;
IEnumerator rotateObject(GameObject gameObjectToMove, Vector3 eulerAngles, float duration)
{
if (rotating)
{
yield break;
}
rotating = true;
Vector3 newRot = gameObjectToMove.transform.eulerAngles + eulerAngles;
Vector3 currentRot = gameObjectToMove.transform.eulerAngles;
float counter = 0;
while (counter < duration)
{
counter += Time.deltaTime;
gameObjectToMove.transform.eulerAngles = Vector3.Lerp(currentRot, newRot, counter/duration);
yield return null;
}
rotating = false;
}
Alle meine Beispiele basieren auf der Bildrate des Geräts. Sie können Echtzeit verwenden, indem Sie Time.deltaTime
durch Time.delta
ersetzen, aber mehr Berechnungen sind erforderlich.
Niemals Quaternionen *** aus irgendeinem Grund verwenden ***. Was Sie versuchen, ist lächerlich einfach. *** Alles, was Sie tun müssen, ist umwandeln. Drehen. *** Es ist nur so einfach. Wahrscheinlich so etwas wie ... transform.Rotate (Time.deltaTime, 0, 0); – Fattie
Ich habe versucht, "transform.Rotate" zu verwenden. Leider habe ich keine Ahnung, wie ich diese Drehung interpolieren kann, um eine sanfte Bewegung zu erreichen. Weißt du wie das geht? – Everest1986