Jump to content
Unity Insider Forum

Kamera verhalten (Erklärt & Gelöst)


w0rks
 Share

Recommended Posts

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 to comment
Share on other sites

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.

  • Thanks 1
Link to comment
Share on other sites

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.

  • Thanks 1
Link to comment
Share on other sites

  • w0rks changed the title to Kamera verhalten (Erklärt & Gelöst)

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

  • Thanks 1
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

×
×
  • Create New...