Developedia
Developedia
Unity fizika és a Rigidbody

Unity fizika és a Rigidbody

A Unity 2D és 3D játékmotorként is használható, de elsődlegesen 3D-re tervezték. Elég hamar felismerték a cégnél, hogy felesleges lekorlátozni a motor használatát 3D-re, hisz az engine tökéletesen alkalmas 2D játékok fejlesztésére is, ha a Z koordinátát figyelmen kívül hagyjuk.

Megjelenítésben a 2D és a 3D elemek a sprite-ok és mesh-ek tökéletesen működnek együtt.

A fizikára viszont két teljesen szeparált, egymással nem kommunikáló rendszer szolgál:

  • 3D Fizika - Nvidia PhysX engine
  • 2D Fizika - Box2D engine

(A Unity biztosít még két egyéb a Package Manager-en keresztül telepíthatő fizikai motort, de használatuk eléggé speciális, ezért itt nem tárgyaljuk őket.)

Rigidbody

Ahhoz hogy egy GameObject a fizikai szimuláció része legyen szükséges egy Rigidbody komponenst hozzáadni.

  • 3D: Rigidbody
  • 2D: Rigidbody2D

(A későbbiekben is sok példa lesz arra, hogy a 2D fizikát kell külön jelezni, de ha 3D-t nem kell kiírni)

icon
Rigidbody és Rigidbody2D

Olyan komponens, amivel egy merev test reprezentáló, amin a 3D vagy 2D fizikai szimuláció részét képezi.

…

A Rigidbody-t gyakran Colider-rel együtt használjuk. Ha Collider-eket is adtok a Rigidbody-k mellé, akkor a testeknek fizikai alakjuk is lesz.

Érdemes 2D és 3D fizika alatt is építeni valamit a (BoxCollider) blokkokból, aztán a Play módban ledönteni azt.

image

Most nézzük át a különböző beállításokat, amit a Rigidbody-n és a Rigidbody2D-n vannak.

  • Is Kinematic (csak 3D)
    • Kikapcsolva: Teljes fizikai szimuláció
    • Bekapcsolva: A mozgást teljes egészében a kód szabályozza. Erők, ütközések és Joint-ok nem befolyásolják a mozgást. A Kinematikus beállítású Rigidbody-k viszont befolyásolják a többi Rigidbody mozgását.
  • Body Type és Simulate (csak 2D)
    • Dynamic: Ütköznek vele a dinamikus Rgidbody2D-k. (Ugyanaz, mintha csak Collider2D lenne a testen, de Rigidbody2D nem.)
    • Kinematic: A mozgást nagyrészt a kód szabályozza viszont a Rigidbody belső velocity és rotation változóját automatikusan alkalmazza a testre. Nincs ütközésdetektálás, csak Trigger detektálás. Erők, ütközések és Joint-ok nem befolyásolják a mozgást.
    • Static: Egy nem mozgó testet reprezentál, amivel viszont ütköznek más dinamikus testek.
  • Simulate (csak 2D)
  • Ha a Simulate ki van kapcsolva, az olyan, mintha se Rigidbody2D se Collider2D nem lenne a GameObject-en.

Az alábbi táblázat foglalja magába, hogy a 2D és 3D fizika különböző funkciói közül melyek működnek egy adott Rigidbody beállításnál.

Body Type
Vele ütköznek
Trigger detekt.
Joint kapcs.
Mozog Forog
Ütközik
Hatnak rá erők
3D Dynamic
✅
✅
✅
✅
✅*
✅
3D Kinematic
✅
✅
✅
🚫
🚫
🚫
Csak 3D Collider
✅
✅*
🚫
🚫
🚫
🚫
2D Dynamic
✅
✅
✅
✅
✅*
✅
2D Kinematic
✅
✅
✅
✅
🚫
🚫
2D Static
✅
✅
✅
🚫
🚫
🚫
Csak Collider2D
✅
✅*
🚫
🚫
🚫
🚫
2D Simulate OFF
🚫
🚫
🚫
🚫
🚫
🚫

Ütköznek vele: Tudja befolyásolni más Rigidbody-k mozgását.

Trigger detektálás: A scriptjei kapnak üzenetet (metódus hívást a) a Trigger ütközésről, *ha a másik Objektumon van Rigidbody.

Joint kapcsolható rá: Összeköthető egy Jointon keresztül másik Rigidbody-val, de a Joint nem feltétlenül tud erőt kifejteni rá.

Mozog, forog: a Rigidbody belső velocity és rotation értéke alapján automatikusan.

Ütközik: A mozgását befolyásolja a más testekkel való ütközés testek, *ha nincs a Trigger beállítás bekapcsolva a Collider-en.

Hatnak rá erők: Gravitáció, Drag, Joint-ok, és egyéb erők befolyásolják a mozgását.

Egyéb Rigidbody beállítások

  • Mass - A test tömeg. (Pl.: Ütközésnél van szerepe.) Hogy milyen mértékegységben értendő a tömeg, az nem megadott. Bővebben: Rigidbody mozgatásaRigidbody mozgatása
  • icon
    Mass / Tömeg

    Egy test tehetetlenségének mértéke.

    Minél nagyobb egy test tömege, annál nagyobb erő kell ahhoz, hogy módosítsuk sebességét.

    Unity fizikában a tömegnek nincs megszabott mértékegysége, de legtöbb esetben javasolt a SI tömeg alapmértéket a kilogrammgot (kgkgkg) használni.

    Jelölésére az mmm szimbólumot használjuk.

    (A másodpercből (mint időmértékből), és választott út és tömeg mértékegységekből kapjuk meg az egyéb leszármazott fizikai mennyiségek egységét is.)

    (Csak dinamikus Rigidbody fizikánál van jelentősége)

  • UseAutoMass (csak 2D) - Automatikusan számítja a tömeget a Unity a Collider felület mérete alapján.
  • Drag / Linear Drag (csak 2D) - Közegellenállás. A mozgás automatikus lassulása. (Nem követ fizikai modellt. Bővebben: Közegellenállás szimulálása)
  • (Csak dinamikus Rigidbody fizikánál van jelentősége)

  • Angular Drag - Az forgás automatikus lassulása.
  • (Csak dinamikus Rigidbody fizikánál van jelentősége)

  • UseGravity / GravityScale - Hasson-e a testen a gravitáció. 2D-ben a mértéke is állítható.
  • (Csak dinamikus Rigidbody fizikánál van jelentősége)

    A gravitációs gyorsulás vektora (iránya és mértéke egyaránt) a Project Settings-ben állítható és a teljes projektre egyenletes lesz:

    (Felső menüsáv / Projekt Settings / Physics vagy Physics(2D) / Gravity)

  • Collision Detection - Hogyan történjen az ütközések detektálása. Bővebben: Ütközés: Collider-ek és Trigger-ek - Collision DetectionÜtközés: Collider-ek és Trigger-ek - Collision Detection
  • Sleep Mode (csak 2D) - Az alvó mód egy optimalizáció, amit lehetőség van kikapcsolni.
  • icon
    Sleep Mode / Alvó mód

    Egy dinamikus Rigidbody sleep, azaz alvó módban van, ha nyugvó helyzetbe kerül. Utána a fizikai motor nem alkalmaz rajta szimulációt addig, amíg nem ütközik valamivel vagy valami új erőhatás nem éri. Az alvó mód egy optimalizációs eszköz, ami jelen van a 2D és 3D fizikában egyaránt.

  • Interpolate: Mikor és hogyan számítsa ki és frissítse a mozgó Rigibody-k megjelenített pozícióját a fizikai motor.
    • None: A megjelenített pozíció frissítés a FixedUpdate-ben történik, amikor a fizikai szimuláció is, tehát meg fog egyezni a fizikai pozícióval. Mozgás alacsony fizikai frissítési sebességgel darabosnak hathat még magas FPS esetén is.
    • Pozíció frissítés a Update-ben (képfrisssítésenként) történik, hogy a mozgás olyan simának hasson, amennyire csak lehetséges. Mivel új fizikai szimuláció, azaz a fizikai pozíció számítása csak FixedUpdate-enként történik, ezért kell valami módszer az Update-ben a megjelenített pozíció egyszerűsített számítására.

    • Interpolate: A legutóbbi két fizikai pozíció közötti interpoláció alapján kerül kiszámításra a megjelenített pozíció. Ezen módszerrel a megjelenített pozíció mindig egy FixedDeltaTime-mal le van maradva a fizikaitól.
    • Extrapolate: A legutóbbi két fizikai pozíció alapján próbálja előre jelezni a mozgást. Gyors irányváltoztatás esetén nagyobb korrigációkra is szükség lehet, amik rendellenes mozgást eredményezhetnek.
  • Constrains:
  • Korlátozni lehet a Rigidbody-k pozícióváltozását és forgását tengelyek szerint. Fontos, hogy a constrain-ekkel lefixált pozíció és rotáció értékei egy GameObject-nek változhatnak, csak nem a fizikai szimuláción keresztül.

Rigidbody aktuális állapota

Egyéb információk is lekérdezhetők kódból, némelyikük be is állítható. Pl.:

Position: A test aktuális fizikai pozíciója.

Rotation: A test aktuális fizikai elfordulása. (3D: Guaternion, 2D: float-angle)

Velocity: A test aktuális mozgási sebessége (sebességvektor).

Angular Velocity: A test aktuális forgási sebessége. (3D: Vector3-Euler angles, 2D: float-angle)

Speed: A mozgási sebességmértéke (sebességvektor vektor hossza)

Max Angular Velocity: Lekorlátozható a sebesség egy maximummal.

Center Of Mass: A test tömegközéppontja. A forgás központja.

World Center Of Mass: A tömegközéppont világkoordinátában kifejezve.

Sleep: Sleep módban van-e a Rigidbody.

Determinisztikus fizika

Ha valami determinisztikus, akkor az a kezdeti állapot alapján egyértelműen számítható és a számításban nincs helye semmi bizonytalanságnak.

Ez azt jelenti, hogy ha egy fizikai szimuláció determinisztikus, akkor bárhányszor lefuttatva ugyanazt az eredményt adja.

icon
A 3D és 2D Unity fizika determinisztikus egy adott számítógépen, de ez adeterminizmus nem garantált különböző gépek és platformok közt.
Logo

Főoldal

Blog

Elmélet

3D Studio

Adatvédelmi nyilatkozat

GY.I.K.

Házirend

Szerző: Marosi Csaba / marosi.csaba@3d-studio.hu

DiscordGitHubLinkedIn