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)
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.
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ása
- 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)
- Angular Drag - Az forgás automatikus lassulása.
- UseGravity / GravityScale - Hasson-e a testen a gravitáció. 2D-ben a mértéke is állítható.
- 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
- Sleep Mode (csak 2D) - Az alvó mód egy optimalizáció, amit lehetőség van kikapcsolni.
- 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.
- 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:
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 () használni.
Jelölésére az 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)
(Csak dinamikus Rigidbody fizikánál van jelentősége)
(Csak dinamikus Rigidbody fizikánál van jelentősége)
(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)
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.
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.
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.