w0rks Posted December 30, 2022 Report Share Posted December 30, 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; } } Quote Link to comment Share on other sites More sharing options...
SkipToPlay Posted December 31, 2022 Report Share Posted December 31, 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. 1 Quote Link to comment Share on other sites More sharing options...
Sascha Posted December 31, 2022 Report Share Posted December 31, 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. 1 Quote Link to comment Share on other sites More sharing options...
w0rks Posted December 31, 2022 Author Report Share Posted December 31, 2022 Wirklich sehr schön erklärt, Danke dafür! 👍 Quote Link to comment Share on other sites More sharing options...
Jog Posted January 1 Report Share Posted January 1 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 1 Quote Link to comment Share on other sites More sharing options...
w0rks Posted January 1 Author Report Share Posted January 1 vor 2 Stunden schrieb Jog: LateUpdate Ok, krass das habe ich noch nie irgendwo gelesen gehabt °° 👍 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.