02.02 - Rigidbody, CharacterController
Rigidbody
Kod razvoja igara, fizika je vrlo bitna, jer obezbeđuje simulaciju stvarnog sveta, i stvarnih reakcija i ponašanje objekata.
Ako prevedemo Rigidbody sa engleskog, dobili bi termin „čvrsto telo“ – a to je baš to. Komponenta Rigidbody omogućava da GameObject deluje pod kontrolom fizičkog engine-a. Na ovaj način objektu možemo dodeliti osobine mase, gravitacije, ubrzanja, i trenja, i ta svojstva možemo podešavati po svojoj volji. Ovo daje mogućnost da se koriste ponašanjima kao što su realistični sudari i pokretanja različitig vrste zglobova na primer. Ako biste manipulisali GameObject-om tako što biste dodavli silu na Rigidbody, mogli biste da stvorite sasvim drugačiji osećaj i izgled u odnosu da ste samo promenili podešavanja komponente Transform. U opštem slučaju, ne bi trebalo da nad istim objektom igre koristite manipulacije i nad Rigidbody-om i Transformom - već samo jednim ili drugim.
Najveća razlika između manipulacije Transformom u odnosu na Rigidbody je upotreba sila. Rigidbody može da bude pod uticajem sile (engl.force) i obrtnog momenta (engl.torque), a nasuprot tome, komponenta Transform to ne može. Pomoću komponente Transform se objekat igre može translirati (pokretati u nekom smeru) i rotirati, ali to nije isto kao i korišćenje fizike. Primetićete jasnu razliku kada to sami isprobate. Dodavanjem sila/momenta na čvrsto telo njemu će se zapravo promeniti i pozicija objekta i rotacija komponente Transform ujedno. Zbog toga bi trebalo da koristite samo jedno ili drugo. Ako vršite promene nad komponentom Transform tokom korišćenja fizike mogli biste izazvati probleme sa kolizijama i drugim proračunima.
Komponenta Rigidbody mora da se eksplicitno doda vašem GameObject-u prvo, da bi na njih mogao da utiče engine za fiziku. Jedan način je da dodate komponentu Rigidbody svom izabranom objektu pomoću Components->Phisics->Rigidbody u menija. Sada je vaš objekat spreman za fiziku; padaće pod uticajem gravitacije i može primiti sile putem skripti, ali možda ćete morati da dodate Collider ili Joint da biste ga naterali da se ponaša tačno onako kako želite.
S obzirom da mi radimo u 2D, komponenta koju dodajemo je RigidBody2D !
Napomena: Kada dodate ovu komponentu vašem objektu igre, pa čak i da ne napišete ni jednu liniju koda, vaš objekat će se kretati nadole pod dejstvom gravitacije i sudaraće se sa drugim objektima ako je na njemu i odgocarajući Collider.
Zadatak: Kreirati 2d igricu i u nju postaviti dva objekta: jedan krug na gornjoj polovini scene i jedan kvadrat na donjoj polovini scene. Kvadrat proširiti malo, o posaviti ispod kruga. Krugu dodeliti komponente RigidBody2d i odgovarajići Collider. Kvadratu nemojte dodeliti nikakve komponente. Šta će se desiti kada pokrenete igru?
Zaustavite igru i onda kvadratu dodelite odgovarajući Collider. Šta će se desiti kada pokrenete igru?
Ponovo zaustavite igru i probajte da menjate opciej koje imate u Inspektoru: "Mass", "Friction" i "Bounce"
Character Controller
Ako nećete da se zamarate sa fizikom, tj ako nećete da koristite RigidBody, drugi način je da se koristi komponenta CharacterController.
Komponenta CharacterController može da se doda objektu igre (vašem igraču na primer). Funkcija ove komponente je da se pomera igrač u odnosu na svoje okruženje ( colliders ). Na njega ne deluje nikakva fizika ,
kao što je bio slučaj sa komponentom RigidBody i uz ovu komponentu ujedno dolazi njemu uvek dolazi i Collider !
Kako to radi: u opštem slučaju se igrač kreće ali tako da ne može da ide kroz objekte koji na sebi imaju Collider.
Sa ovom komponentom jeste velika kontrola nad kretanjem igrača, ali je povećano korišćenje programskog koda jer se tada treba skoro sve i isprogramirati!
Character Controller u sebi sadrži 2 metode koje se koriste za kretanje igrača: SimpleMove i Move.
SimpleMove uzima brzinu kao parametar i na osnovu toga pokreće igrača. Sem toga, na igrača će da deluje i gravitacija. To je jedina fizika koju dobijate u sklopu korišćenje komponente CharacterController. Nezgodacija je što će tada brzina u pravcu y-ose biti ignorisana.
Move će da zahteva malo više posla, ali ima manje ograničenja. Parametre koje uzima je apsolutni pomeraj, koji zavisi od broja frejmova u sekundi, a gravitaciju treba dodati ručno (programski).
Prosto kretanje:
Dodajte novi objekat igre - Player2, dodajte mu komponentu CharacterController.
Kreirati novu C# skriptu i nazvati je "Character", pa je dodati objektu na igri. Trebaće nam javna promenljiva u koju možemo da upišemo kolika je brzina, a privatna promenljiva u kojoj će da se smesti referenca na našu komponentu CharacterController. Ta referenca se preuzima u metodi Start():
public class Character : MonoBehaviour
{
private CharacterController _controller;
void Start()
{
_controller = GetComponent<CharacterController>();
} // ...
U metodi Update() ulaze smeštamo u Vector3 na sledeći način:
void Update()
{
Vector3 move = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
_controller.Move(move * Time.deltaTime * Speed);
}
Poziv metode Move trenutnog CharacterController-a je sa parametrima ulaznog vektora pomnoženog sa brzinom i sa DeltaTime da bi bilo nezavisno od broja frejmova u sekundi.
Zadatak: Pokušajte da uradite zadatak kao u video snimku:
Opcioni Zadatak (za bolje učenike):
➤Game Assets: https://drive.google.com/file/d/1D66L...
➤Background Music: https://assetstore.unity.com/packages...
*************************************************************************************
Dodatni materijali (sa one koji žele da znaju više):