3D-Physics

Rigidbody

Rigidbodies erlauben es Körpern, physikalisch verändert zu werden und gibt der Engine bei jedem Frame, anders als bei normalen GameObjects, immer seine Position mit.

Sie besitzen:

Des Weiteren kann man einstellen, auf welchen Achsen sich der Rigidbody nicht bewegen und rotieren darf.

Colliders

Colliders setzen einen Rigidbody voraus, standardmäßig ist bei simplen GameObjects immer ein Collider beigefügt.
Einfach gesagt erlaubt ein Collider einem Rigidbody, mit anderen GameObjects zu interagieren.
Im Script kann man Kollisionen auf 3 Arten detecten:

    OnCollisionEnter(Collision collision)
    {
        //Aufgerufen bei erster Berührung
    }
 
    OnCollisionStay(Collision collision)
    {
        //Aufgerufen, wenn sich die Körper noch immer berühren
    }
 
    OnCollisionExit(Collision collision)
    {
        //Bei der letzten Berührung aufgerufen
    }

Es gibt mehrere Arten von Collidern:

Primitive Collider

Sind Formen, wie beispielsweise Kugeln, Kapseln, Würfel, Zylinder, etc.
Der Vorteil von diesen ist der minimale Aufwand für die CPU/GPU.

Mesh Collider

Entspricht genau den Dimensionen des GameObjects. Dadurch können Kollisionen so genau wie möglich detected werden.
Das Problem hierbei ist jedoch, dass dies einen großen Aufwand für RAM, CPU und GPU darstellt.

Compound Collider

Ist eine Mischung zwischen den ersten beiden Arten. Entspricht in etwa dem vorgegebenen Mesh des GameObjects.
Verwenden sollte man diesen, wenn das GameObject zwar komplizierte Strukturen besitzt, man aber minimalen Overhead haben möchte.
Die Detektion ist jedoch nicht so genau, als wie beim Mesh Collider.

Trigger

Ein Collider kann auch im Inspect-Menü in einen Trigger umgewandelt werden.
Dies bewirkt, dass zwar keine physikalische Kollision vorkommt, aber doch eine Collision von der Engine detected wird.
Voraussetzung ist hier auch wieder ein Rigidbody.
Wie bei Kollisionen gibt es auch hier wieder 3 Arten, Trigger im Script zu nutzen. Man ersetzt einfach das Collision (z.B. bei OnCollisionEnter) durch Trigger.
Dies benutzt man, wenn man zwar Interaktionen durchführen möchte, aber keine Kollision verursachen möchte. (z.B.: Hover-Zone, Script darunter.)

    public float hoverForce=15f;
 
    void OnTriggerStay(Collider other)
    {
        other.Rigidbody.AddForce(Vector3.up * hoverForce, ForceMode.Acceleration);
    }
 
    //Bei einer Kollision mit einem unsichtbaren Würfel, der als Trigger gestzt ist, schwebt z.B. die Kugel dann in diesem Bereich.
    //Falls other nicht als Rigidbody erkannt werden sollte, kann man den Rigidbody als public-Variable defnieren und im Editor hinzufügen.
    //Dann wäre hinzuzufügen:
    //public Rigidbody object;
    //Und statt other.Rigidbody schreibt man:
    //object.AddForce(Vector3.up * hoverForce, ForceMode.Acceleration);

Physic Materials

Im Gegensatz zu normalen Materials ändern Physic Materials nicht das Aussehen, sondern physikalische Eigenschaften von Körpern.
Dabei kann man verschiedene Eigenschaften ändern:

Physic Joints

Video: Physic Joints

Physic Joints benutzt man, um Federn etc. zu simulieren.
Auch hier gibt es wieder 3 Arten:

Fixed Joint

Bleibt an einer Stelle festgehalten, kann, wenn die Parameter für BreakForce nicht auf infinity gesetzt sind, aber abgebrochen werden.
Dies kann man beispielsweise gut als Kopfstück einer Ketter benutzen.

Spring Joint

Kann frei herumbouncen. Für diesen Component gibt es mehrere Settings:

Dies kann man gut benutzen, um die einzelnen Stücke einer Kette zu simulieren.

Hinge Joint

Kann beispielsweise gut zur Simulation einer Tür verwendet werden.
Die Settings für diesen Komponenten sind:

Raycasting

Video: Raycasting

Raycasting ist eine Methode, um zu überprüfen, ob ein Objekt auf seinem Weg auf ein anderes stößt.
Dabei sieht die Syntax so aus:

Physics.Raycast(Vector3 ursprung, Vector3 richtung, RaycastHit info, float distanz, int LayerMask);

Am Anfang sieht dies etwas verwirrend aus, ist es aber eigentlich nicht:

Die zwei Vector3 - Variablen kann man im Variablentyp Ray zusammenfassen, wenn diese bereits vorher intialisiert werden sollen.
Nutzen kann man dies beispielsweise für Detection, ob Schüsse treffen, oder, um einen Fallschirm kurz vor dem Boden öffnen zu lassen.


Johannes Schörghuber 2016/01/29 07:37