w0rks Geschrieben 30. Dezember 2022 Melden Share Geschrieben 30. Dezember 2022 Hallo Ihr Lieben ◠‿◠ War jetzt schon etwas länger nicht mehr hier im Forum & möchte etwas Fragen, ich habe zwar KEIN Problem aber mich interessiert es & zwar: Arbeite ich aktuell wieder an einem Game dass dieses mal 2D ist, der Charakter im Video habe ich erstellt (wird aber noch weiterhin verbessert^^) . . . Ich habe hier 2 Skripte für die Kamera (Beide haben die selbe Aufgabe) dass die Kamera dem Charakter folgt. Beide Skripte wurden unterschiedlich geschrieben! und beide sind nicht von mir! Aber was ich nicht verstehe & was mich interessiert ist, warum funktioniert der eine Flüssig & der andere nicht? (man sieht es an der Bewegung) Ich kenne mich in der Programmierung mit C# nicht gut aus! Bitte erklärt es mir so dass ich es verstehe😂 Skript 1: using System.Collections; using System.Collections.Generic; using UnityEngine; public class CameraFollow : MonoBehaviour { public float FollowSpeed = 2f; public float yOffset =1f; public Transform target; // Update is called once per frame void Update() { Vector3 newPos = new Vector3(target.position.x,target.position.y + yOffset,-10f); transform.position = Vector3.Slerp(transform.position,newPos,FollowSpeed*Time.deltaTime); } } Skript 2: using System.Collections; using System.Collections.Generic; using UnityEngine; public class CameraFollow2 : MonoBehaviour { public Transform target; public Vector3 offset; [Range(1,10)] public float smoothFactor; private void FixedUpdate() { Follow(); } void Follow() { Vector3 targetPosition = target.position + offset; Vector3 smoothPosition = Vector3.Lerp(transform.position, targetPosition,smoothFactor*Time.fixedDeltaTime); transform.position = smoothPosition; } } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
SkipToPlay Geschrieben 31. Dezember 2022 Melden Share Geschrieben 31. Dezember 2022 Wenn ich mir die Skripte kurz anschaue sehe ich beim zweiten direkt, dass dieses Skript die FixedUpdate-Methode verwendet. Diese wird unabhängig zur Framerate (Standardm. 50x pro Sek.) ausgeführt, weshalb diese für eine wirklich flüssige Bewegung für Animationen nicht verwendet werden sollte. Stattdessen sollte Update verwendet werden. Jedoch muss darauf geachtet werden, dass die Bewegungsgeschwindigkeit dann nicht an der Framerate gekoppelt ist. Das erste Skript macht es da schon grundsätzlich richtig, denn mit Time.deltaTime erhält man die Zeitspanne seit dem letzten Frame und man kann dementsprechend den richtigen frame unabhängigen Zielpunkt bestimmen. Ohne den Code aufs Detail zu analysieren bin ich mir aber nicht sicher, dass die gewählte mathematische Funktion für die Berechnung der Zielposition für dein Vorhaben geeignet ist. Außerdem verwendest du einmal Slerp und beim anderen Lerp. Wenn es darum geht, dass eine Kamera ein Objekt folgen soll, empfehle ich, dass du dir Cinemachine anschaust, dann musst du dir mit der Implementierung nicht den Kopf zerbrechen und alles andere ist Einstellungssache. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 31. Dezember 2022 Melden Share Geschrieben 31. Dezember 2022 Falls Englisch für dich okay ist... http://blog.13pixels.de/2019/what-exactly-is-fixedupdate/ FixedUpdate ist das MonoBehaviour-Event, mit dem du wirklich Framerate-unabhängig wirst. In einigen Fällen reicht Update auch, z.B. weil es um einen linearen Ablauf geht oder der Unterschied nicht für das Spiel entscheidend ist. Wenn z.B. eine Knopf-Animation bei unterschiedlicher Framerate minimal anders aussieht, ist das meistens kein Beinbruch. Update hat allerdings dieselbe Frequenz, auf der das Spiel rendert. FixedUpdate nicht. Du kannst mehrere Updates (und damit auch Renders) zwischen zwei FixedUpdates oder mehrere FixedUpdates zwischen zwei Updates haben. Wenn du merkst, dass du FixedUpdate nutzen willst, dann musst du mit etwas Code das Stottern beseitigen. Wenn du dir mal den Inspektor der Rigidbody-Komponente anschaust, siehtst du da die Eigenschaft "Interpolate". Die macht genau das, weil Rigidbodys mit der Physik-Engine auf FixedUpdate laufen, aber dann bitte auch nicht stottern sollen. In meinem Artikel oben hab ich ein Script verlinkt, das das für beliebige Objekte machen kann. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
w0rks Geschrieben 31. Dezember 2022 Autor Melden Share Geschrieben 31. Dezember 2022 Wirklich sehr schön erklärt, Danke dafür! 👍 Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Jog Geschrieben 1. Januar 2023 Melden Share Geschrieben 1. Januar 2023 Hallo, Einen Hab ich noch 😉 LateUpdate Wird zwar oft nicht verwendet oder vergessen dass es die überhaut gibt, ist aber in machen Situationen wichtig. Die Methode LateUpdate() wird aufgerufen, nachdem alle Update-Funktionen aufgerufen wurden, aber noch vor dem Rendern. Dies ist nützlich, um die Skriptausführung zu ordnen. Zum Beispiel sollte eine Verfolgerkamera, in der LateUpdate() Methode implementiert sein, da Objekte nachverfolgt werden, die möglicherweise in Update oder FixedUpdate Funktionen bewegt wurden. Dies sollte sicherstellen dass, alle verfolgten Objekte bewegt wurden, bevor die Kamera aktualisiert wird, um ein „Nachspringen“ der Kamera zu vermeiden. Gruß Jog Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
w0rks Geschrieben 1. Januar 2023 Autor Melden Share Geschrieben 1. Januar 2023 vor 2 Stunden schrieb Jog: LateUpdate Ok, krass das habe ich noch nie irgendwo gelesen gehabt °° 👍 Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.