Rigidbody2D to komponent, który sprawia, że nasz Game Object podlega prawom fizyki. W tym wpisie skupię się na możliwości konfiguracji poszczególnych typów tego komponentu.

Po co ten cały ‚Rigid Body’?

Jak już pisałem w poście na temat metod Update() i FixedUpdate(), Unity posiada wbudowany silnik odpowiedzialny za kalkulacje związane z fizyką. Dodając do obiektu komponent RigidBody2D, przekazujemy ten obiekt pod kontrolę wspomnianego silnika. Wtedy to on odpowiada za wszelkie transformacje i przesunięcia obiektu na scenie – zgodnie z symulowanymi prawami fizyki. Oczywiście nadal możemy dodatkowo robić to sami, ale może mieć to nieprzewidywalne skutki. Obiekt, który posiada komponent RigidBody2D powinniśmy poruszać tylko poprzez przykładanie do niego siły.

Ustawienia komponentu

Body Type

W pierwszej kolejności musimy wybrać jedną z trzech opcji. Ciało może być:

  • Dynamiczne (Dynamic)
  • Kinetyczne (Kinematic)
  • Statyczne (Static)

Od tego ustawienia uzależniona jest dostępność pozostałych opcji.

Dynamic Body

Typ najbardziej zaawansowany i jednocześnie najbardziej obciążający procesor. Kalkuluje wpływ grawitacji, przykładanych „programistycznie” sił, oraz sił związanych z kolizjami z innymi obiektami.

Dostępne ustawienia:

 

Material – Możemy (nie musimy) określić z jakiego materiału stworzone jest ciało naszego obiektu. Definiujemy w tym celu Physics Material 2D, który określa współczynnik tarcia, oraz „odbijalność” obiektu (czy ma się zachowywać bardziej jak gumowa piłka, czy jak cegła). Zazwyczaj do Game Object dodajemy jednocześnie RigidBody2D oraz Collider2D, który też ma swój materiał. Musimy pamiętać, że jeśli zdefiniujemy materiał w colliderze, to materiał z rigid body zostanie zignorowany.

Simulated – jeśli odznaczymy ten checkbox, obiekt zostanie „wyjęty” z symulacji, nie otrzyma, ani nie przekaże innym obiektom żadnych sił.

Use Auto Mass – Jeśli zaznaczymy tą opcję, to na przypiętym do obiektu colliderze (Collider2D) pojawi się możliwość ustawienia gęstości (density). Masa naszego rigid body zostanie obliczona ze wzoru (pole collidera) * gęstość.

Mass – Nie wymaga większego komentarza – określamy masę ciała. Opcja niedostępna, jeśli zaznaczymy Use Auto Mass.

Linear Drag – Nie wiem za bardzo, jak to przetłumaczyć. Przyciąganie liniowe? Bezwładność? Im większy współczynnik, tym mniejszy wpływ aplikowanych sił na przemieszczenie obiektu.

Angular Drag – podobnie jak Linear Drag, tylko zwiększając współczynnik, ograniczamy możliwość rotacji obiektu.

Linear i Angular Drag łatwiej jest zrozumieć na przykładzie:

Tutaj po lewej Linear Drag = 0, po prawej Linear Drag = 50

A tutaj, po lewej Angular Drag = 0 i po prawej Angular Drag = 50

Gravity Scale – Siła grawitacji jest ustawiana globalnie dla całej sceny (klasa Physics2D), natomiast zmieniając Gravity Scale, możemy sprawić, aby na nasz konkretny obiekt oddziaływała tylko jakaś część globalnej siły grawitacji. Ustawiając wartość zero, zupełnie wyłączymy grawitację dla danego obiektu.

Collision Detection – sposób wykrywania kolizji pomiędzy colliderami (Collider2D). Możemy wybrać jedną z dwóch opcji:

  • Discrete – mniej dokładna, jeśli obiekty poruszają się za szybko, kolizja może nie zostać wykryta. Punkty „styku” kolizji wyliczane są po zakończeniu ruchu, na podstawie faktycznego położenia obiektów.
  • Continous – Silnik najpierw kalkuluje punkty styku najbliższej kolizji, a potem przemieszcza obiekt. To rozwiązanie jest dokładniejsze, ale bardziej obciąża procesor.

Sleeping Mode – Rzadko zdarza się tak, że wszystkie obiekty na scenie są w ciągłym ruchu i siły działające na nie muszą być kalkulowane. W celu oszczędzania zasobów, możemy ustawić, kiedy faktycznie mają być wykonywane obliczenia dla danego obiektu:

  • Never sleep – obliczenia są wykonywane cały czas, nawet jeśli z obiektem „nic się nie dzieje” – najbardziej obciążająca opcja.
  • Start Awake – początkowo kalkulacje będą wykonywane, jednak jeśli z obiektem nic się nie będzie działo, może zostać „uśpiony”.
  • Start Asleep – Obiekt będzie uśpiony do czasu pierwszej kolizji, lub przyłożenia siły. Obiekt może znowu zostać uśpiony, jeśli nic się z nim nie będzie działo.

Interpolate – „wygładzanie” ruchu, dostępne są 3 opcje:

  • None – brak wygładzania.
  • Interpolate – Ruch jest wygładzany na podstawie poprzednich kroków symulacji.
  • Extrapolate – Ruch jest wygładzany na podstawie szacowanej pozycji obiektu w następnych krokach symulacji.

Constrains – możemy zablokować ruch obiektu w dowolnej osi, w tym jego możliwość obrotu.


Kinematic Body

Ten typ ciała jest mniej obciążający dla procesora, dlatego, że jest wyłączony z wielu obliczeń. Nie podlega grawitacji i nie wchodzi w interakcje z innymi ciałami typu Kinematic lub Static. Koliduje jedynie z dynamicznymi ciałami, jednak w symulacji zachowuje się tak, jakby miał nieskończona masę – będzie oddziaływał na te obiekty, ale one na niego nie. Ciało typu Kinematic możemy programistycznie wprawiać w ruch, jednak musimy go cały czas kontrolować, bo żaden inny obiekt ani siły w symulacji nie będą w stanie tego ruchu spowolnić lub zatrzymać.

Dostępne ustawienia:

 

Material – identycznie jak dla Dynamic Body.

Simulated – identycznie jak dla Dynamic Body.

Use Full Kinematic Contacts – jeśli zaznaczymy tą opcję, ciało będzie wykrywać kolizję z innymi ciałami typu Kinematic i Static, ale wciąż będzie się przy tym zachowywać jak nieruchomy obiekt o nieskończonej masie. Przy odznaczonej opcji, kolizje wykrywane są tylko z ciałami typu Dynamic.

Collision Detection – identycznie jak dla Dynamic Body.

Sleeping Mode – identycznie jak dla Dynamic Body.

Interpolate – identycznie jak dla Dynamic Body.

Constraints – identycznie jak dla Dynamic Body.


Static Body

Ostatni, najbardziej przyjazny procesorowi typ. Z definicji – nie rusza się i zachowuje się jakby miał nieskończona masę. Koliduje tylko ciałami typu Dynamic.

Dostępne ustawienia:

 

Material – identycznie jak dla Dynamic Body.

Simulated – identycznie jak dla Dynamic Body.