Jump to content
Unity Insider Forum
Sign in to follow this  
Lightstorm

Bewegliche Kamera und bewegliche Plattformen

Recommended Posts

Das Thema bewegliche Plattformen geht in die nächste Runde glaube ich :D

Ich habe eine Kamera die den Spielcharakter verfolgt. Im Prinzip so:

transform.position = Vector3.SmoothDamp(transform.position, targetPos, ref velocity, .1f);

targetPos ist die Position des Spielcharakter. Das ganze wird in FixedUpdate() ausgeführt. Der Spielcharakter wird über rigidbody2D bewegt. Wenn ich die Position der Kamera in Update() ändere entsteht ein hässliches ruckeln wenn die Kamera den Spieler verfolgt.

Nun habe ich bemerkt dass eine animierte Plattform (Unity Animation mit Animator Komponente) das selbe ruckeln erzeugt nachdem der Spielcharakter auf die Plattform hüpft und zum Kindsobjekt der Plattform wird.

Siehe auch:

 

Das liese sich lösen wenn die Kameraposition in Update() statt FixedUpdate() aktualisiert wird. Dann verschwindet das ruckeln beim verfolgen auf der Plattform. Dann aber habe ich wie oben erwähnt das ruckeln wenn sich der Spielcharakter normal außerhalb der Plattform bewegt.

Soweit ich verstehe hat das damit zu tun das FixedUpdate() und Uptate() unterschiedlich oft aufgerufen werden. Die Frage ist wie kann ich das nun angleichen. Wie kann ich die animierte Plattform dazu bringen dass es sich mit der Frequenz von FixedUpdate() aktualisiert?

Share this post


Link to post
Share on other sites

Also:

Die Update wird sooft aufgerufen, wie deine Garfikkarte die Bilder darstellen kann und dein Prozeossor alles berechnen kann, bzw. mit der Geschwindigkeit der Targetframerate.
Das bedeutet, dass sie bei einem schnellen System auch ohne weiteres 200 Mal die Sekunde aufgerufen werden könnte. Es ist aber immer abhängig von all den Berechnungen die da passieren und ist somit immer variable.
Dein FixedUpdate Zyklus ist voreingestellt und kann von dir Erhöht oder auch verringert werden. In der Regel ist das ein Synchroner Wert, es sei denn, du hast plötzlich ganz fieße Physikberechnungen drin, die dann diesen Zyklus kurzzeitig verlängern würden.
Aber wie dem auch sei, beide Zyklen sind nie synchron und deswegen kann es zum Ruckeln zwischen beweglichen Objekten kommen, wenn sie in unterschiedlichen Updatezyklen verarbeitet werden.
In der Regel lässt man alles, was nicht physikalisch bewegt wird, über die Update ablaufen. Um das ruckeln eines RB's zu unterbinden, kann man ihn auf interpolate stellen.inter.JPG.96885782a2ff9787609c3b59e1a60aba.JPG

Dadurch wird der Zwischenschritt, den die Update zeigen würde, aber die Fixedupdate noch nicht hat, ermittelt und trotzdem gezeichnet.

Die Kamera sollte dem Objekt trotzalledem nie direkt folgen. Ich würde über Lerp ein weiches Nachfolgen generieren. Man kann bei Lerp eigentlich sehr gut einstellen, wie schnell sie der Kamera folgt, denn da stellt man ja ein, wieviel % des Weges zwischen jetziger Position und dem Ziel überwuden werden soll.

 

myPosi =transform.position;
myPosi = Vector3.Lerp(myPosi, targetPosi, speed * Time.deltaTime);
transform.position= myPosition;

Die Kamera wird zwar nie die Zielposition erreichen, aber das macht nix. :)

Versuch das mal so.

  • Thanks 1

Share this post


Link to post
Share on other sites

@malzbie

Wenn ich die Kameraposition mit der Lerp Methode über Update aktualisiere und das Rigidbody des Spielcharakter auf Interpolate setze funktioniert es so wie es soll. Kein ruckeln auf der Plattform.

Aber es taucht ein anderes Problem auf. Wenn der Spielcharakter sich auf der beweglichen Plattform bewegt stottert es dabei und bewegt sich nur langsam vorwärts. Wenn ich Interpolate auf Extrapolate einstelle ist auch dieses Problem gelöst.

Ist das ok so? Über Extrapolate heißt es in der Dokumentation dass dadurch schnelle rigidbody Objekte bei Collisionen in die Collider rein geraten könnten.

Share this post


Link to post
Share on other sites

Ob das so ok ist, kann ich nicht sagen. Extrapolate heisst ja, dass quasi vorberechnet wird, wo sich der RB befinden wird. Es ist also eine Annahme. Es kann schon sein, dass bei "schnellen" Bewegungen Probleme auftauchen könnten. Es kann auch sein, dass das Verhalten seltsam aussehen kann, wenn es zu Richtungsänderungen kommt.

Die Frage ist, ob du überhaupt alles mit der Physik machen musst. Ich persönlich würde den Character über Transform steuern und auch die Schwerkraft damit simulieren. Bei einem Plattformer Game sollte es nie zu so hohen Geschwindigkeiten kommen, dass die Collider durchtunnelt werden.
Aber das ist meine eigene Meinung. Man kann natürlich auch die Physik komplett nutzen ( mit ein paar Problemchen, wie du auf der Plattform ja siehst).
Es gibt viele funktionale Möglichkeiten. Es geht auch ganz ohne RB. Da muss man eben mal ein wenig Raycasten, um zu erkennen, ob und was unter oder vor einem ist.

Share this post


Link to post
Share on other sites

Hm ok verstehe. Ich belasse es vorerst bei der Lösung dass das rigidbody auf der Plattform auf extrapolate eingestellt wird und außerhalb auf interpolate.

private void OnTriggerEnter2D(Collider2D collision)
    {
        collision.transform.parent = gameObject.transform;
        if (collision.attachedRigidbody)
            collision.attachedRigidbody.interpolation = RigidbodyInterpolation2D.Extrapolate;
    }

    private void OnTriggerExit2D(Collider2D collision)
    {
        collision.transform.parent = null;
        if (collision.attachedRigidbody)
            collision.attachedRigidbody.interpolation = RigidbodyInterpolation2D.Interpolate;
    }

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×