unity3d
Fizyka
Szukaj…
Sztywne ciała
Przegląd
Komponent Rigidbody nadaje GameObject fizyczną obecność na scenie, ponieważ jest w stanie reagować na siły. Możesz przyłożyć siły bezpośrednio do GameObject lub pozwolić mu reagować na siły zewnętrzne, takie jak grawitacja lub inny uderzający go obiekt sztywny.
Dodanie komponentu Rigidbody
Możesz dodać Rigidbody, klikając Component> Physics> Rigidbody
Przenoszenie obiektu Rigidbody
Zaleca się, aby w przypadku zastosowania obiektu sztywnego do obiektu GameObject użyć sił lub momentu obrotowego, aby go przesunąć, zamiast manipulować jego transformacją. Użyj do tego metod AddForce()
lub AddTorque()
:
// Add a force to the order of myForce in the forward direction of the Transform.
GetComponent<Rigidbody>().AddForce(transform.forward * myForce);
// Add torque about the Y axis to the order of myTurn.
GetComponent<Rigidbody>().AddTorque(transform.up * torque * myTurn);
Masa
Możesz zmienić masę obiektu sztywnego ciała, aby wpłynąć na jego reakcję z innymi sztywnymi ciałami i siłami. Wyższa masa oznacza, że GameObject będzie miał większy wpływ na inne GameObjecty oparte na fizyce i będzie wymagał większej siły, aby się poruszyć. Obiekty o różnej masie spadają z tą samą prędkością, jeśli mają takie same wartości oporu. Aby zmienić masę w kodzie:
GetComponent<Rigidbody>().mass = 1000;
Opór
Im wyższa wartość oporu, tym bardziej obiekt zwalnia podczas ruchu. Pomyśl o tym jak o przeciwnej sile. Aby zmienić przeciąganie kodu:
GetComponent<Rigidbody>().drag = 10;
isKinematic
Jeśli zaznaczysz ciało sztywne jako kinematyczne, nie mogą na niego wpływać inne siły, ale nadal mogą wpływać na inne obiekty gry. Aby zmienić kod:
GetComponent<Rigidbody>().isKinematic = true;
Ograniczenia
Możliwe jest również dodanie ograniczeń do każdej osi, aby zamrozić pozycję lub obrót ciała sztywnego w przestrzeni lokalnej. Wartość domyślna to RigidbodyConstraints.None
pokazane tutaj:
Przykład ograniczeń w kodzie:
// Freeze rotation on all axes.
GetComponent<Rigidbody>().constraints = RigidbodyConstraints.FreezeRotation
// Freeze position on all axes.
GetComponent<Rigidbody>().constraints = RigidbodyConstraints.FreezePosition
// Freeze rotation and motion an all axes.
GetComponent<Rigidbody>().constraints = RigidbodyConstraints.FreezeAll
Możesz użyć bitowego operatora OR |
aby połączyć wiele takich ograniczeń:
// Allow rotation on X and Y axes and motion on Y and Z axes.
GetComponent<Rigidbody>().constraints = RigidbodyConstraints.FreezePositionZ |
RigidbodyConstraints.FreezeRotationX;
Kolizje
Jeśli chcesz, aby GameObject ze sztywnym nadwoziem na nim reagował na kolizje, musisz także dodać zderzacz. Rodzaje zderzaczy to:
- Zderzacz pudełek
- Zderzacz sfer
- Zderzak kapsułek
- Zderzak kół
- Zderzak siatki
Jeśli zastosujesz więcej niż jeden zderzacz do GameObject, nazywamy go zderzaczem złożonym.
Możesz przekształcić collider w Trigger w celu użycia OnTriggerEnter()
, OnTriggerStay()
i OnTriggerExit()
. Zderzacz wyzwalaczy nie reaguje fizycznie na kolizje, inne obiekty GameObject po prostu przez niego przechodzą. Są one przydatne do wykrywania, gdy inny GameObject znajduje się w określonym obszarze lub nie, na przykład podczas zbierania przedmiotu, możemy chcieć po prostu przez niego przejść, ale wykryć, kiedy to nastąpi.
Grawitacja w sztywnym ciele
Właściwość useGravity
obiektu RigidBody
kontroluje, czy grawitacja na nią wpływa, czy nie. Jeśli ustawione na false
RigidBody
będzie zachowywał się tak, jakby był w przestrzeni kosmicznej (bez stałej siły działającej w jakimś kierunku).
GetComponent<RigidBody>().useGravity = false;
Jest to bardzo przydatne w sytuacjach, gdy potrzebujesz wszystkich innych właściwości RigidBody
oprócz ruchu kontrolowanego przez grawitację.
Po włączeniu na RigidBody
będzie oddziaływać siła grawitacji, skonfigurowana w Physics Settings
:
Grawitacja jest zdefiniowana w jednostkach świata na sekundę do kwadratu i jest wprowadzana tutaj jako trójwymiarowy wektor: co oznacza, że przy ustawieniach na przykładowym obrazie wszystkie obiekty RigidBodies
z właściwością useGravity
ustawioną na True
będą doświadczać siły 9,81 jednostek świata na sekundę na sekundę w dół (jako ujemne wartości Y w układzie współrzędnych Unity wskazują w dół).