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:

wprowadź opis zdjęcia 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 :

wprowadź opis zdjęcia tutaj

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ół).



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow