Obiektami gry w Unity są przede wszystkim obiekty 3D i 2D ale także kamery, źródła światła, obiekty puste (prawdopodobnie coś co grupuje kilka obiektów) itd.

GameObject posiada komponenty czyli coś na kształt rozszerzeń funkcjonalności. Pewne komponenty są w standardzie (Transform), inne można dołożyć samodzielne (np. odpowiedzialne za fizykę). Pewnym rodzajem komponentu są skrypty C# podczepione pod obiekty.

Transform

Komponent obiektu odpowiedzialny za przechowywanie położenia, rotacji i skali każdego obiektu na scenie. Pozwala manipulować tymi parametrami wprost.

O ile z position nie ma problemu, to manipulując rotation i scale należy pamiętać, że obowiązuje w ich przypadku układ lokalny modelu.

lokalizacja przycisku pozwalającego na podgląd osi w układzie lokalnym modelu

Collider

Komponent odpowiada za kolizję z innymi obiektami na scenie. Jeżeli obiekt nie ma zdefiniowanego Collidera, inne obiekty przenikają przez niego.

Komponent Collider ma kilka wersji, dla prostych obiektów dodanych z poziomu GameObject -> 3D Objects mogą to Sphere Collider, Cube Collider itd. Dla płaszczyzn czy modeli z Blendera jest to Mesh Collider.

Mesh Collider

Opcja która może się przydać to Convex – należy ją zaznaczyć jeżeli obiekt ma się ruszać i zderzać z innymi obiektami.

Detekcja kolizji

Do obsługi zderzeń służą dwie funkcję o nieco odmiennym charakterze.

OnTriggerEnter – wymaga ona zaznaczenie w edytorze, w sekcji Collidera opcji Is Trigger. Wtedy, funkcja ta będzie wywoływana gdy coś (ale raczej powinno to być Rigidbody – sprawdzić) będzie miało kontakt siatką Collidera.

Jednocześnie, włączenie opcji Is Trigger powoduje, że obiekt „zapomina”, że powinien kolidować z innymi obiektami i nie działa na niego fizyka z Rigidbody. Ale to zamierzone działanie twórców i mające pewne uzasadnienie.

Można uniknąć tego efektu, stosując na obiekcie dwa Collidery. Jeden może odpowiadać za zbieranie zdarzeń (może to być prosty BoxCollider lub Sphere Collider) a drugi, już bez zaznaczonej opcji Is Trigger sprawia, że obiekt zachowuje się normalnie.

Funkcja przedstawia się następującą.

public void OnTriggerEnter(Collider collision)
{
    if (collision.gameObject.name == "Sphere") { ... }
}

OnCollisionEnter – druga przydatna funkcja. W jej przypadku, nie trzeba zaznaczać Is Trigger, wiec obiekty zachowują się tak jak powinny, tj. stoją na scenie ograniczane przez collidery innych obiektów.

public void OnCollisionEnter(Collision collision)
{
   ....
}

Dzięki obiektowi Collision, w prosty sposób można się dobrać do punktów kontaktu

for (int i = 0; i < collision.contactCount; i++) {
    ContactPoint p = collision.GetContact(i);

}

Przydatne parametry ContactPoint to:

point – położenie miejsca kolizji (Vector3)

normal – wektor normalnej miejsca styku (Vector3)


Physic Material

Physic Material odpowiada za parametry fizyczne powierzchni obiektu – tarcie i odbijalność. Podobnie jak zwykły materiał, jest to obiekt dodawany do Assets. Przypisanie Physic Material do obiektu odbywa się poprzez Collider – jest tam parametr Material.

Formularz parametrów Physic Material

Parametry:

Dynamic i Static Friction – tarcie statyczne i dynamiczne. Tarcie statyczne występuje gdy obiekt jest nieruchomy a chce się go wprawić w ruch. Tarcie dynamiczne z kolei, gdy obiekt się już porusza. Generalnie, starcie statyczne jest z zasady większe niż dynamiczne (w ramach konkretnej powierzchni). Najlepszy przykład to obrazujący to przesuwanie szafy. Gdy już ruszy się ją z miejsca to jakoś idzie.

Im większa wartość Friction , tym powierzchnia bardziej chropowata, trzeba użyć większej siły by przesunąć inny obiekt po takiej powierzchni.

Bounciness – ja to nazywam odbijalność, być może lepszym określeneim była by sprężystość. Jeżeli ten parametr jest większy od zera, materiał nabiera parametrów gumy, tzn. odbija się. Zakres od 0 do 1.

Mówiąc o tarciu i odbijalności, należy pamiętać, że na efekt końcowy, czyli na to co się będzie dziać na ekranie, mają wpływ materiały fizyczne dwóch obiektów wchodzących w interakcję. Nawet jeżeli, nie zdefiniujemy takiego materiały, np dla podłoża to Unity używa pewnych domyślnych wartości do obliczeń. I tu pojawia się kwestia, jak liczyć ostateczną wartość tarcia i odbijalności dla dwóch materiałów. Odpowiadają dwa parametry Combine. Jeżeli che się uzyskać wyraźny efekt, można jest ustawić na maximum.

Rigidbody

Komponent odpowiedzialny za obsługę fizyki. Obiekt zachowuje się jak bryła sztywna (uproszczony model fizyczny). Mogą na niego oddziaływać siły od grawitacji począwszy.

Po dodaniu komponentu należy pamiętać o ustawieniu parametrów Interpolate – Interpolate oraz Collision Detection – Continuous. Dzięki temu ruch obiektu będzie płynny.

Przechwycenie obiektu:

Rigidbody rigidbody = this.GetComponent<Rigidbody>(); 

Camera

O położeniu kamery i o tym na co „patrzy” decyduje obiekt transform. Tak naprawdę kamera to wektor osadzony w przestrzeni. Linia „wzroku” to oś „Z”.

O położenie kamery decyduje struktura position:

 this.transform.position = new Vector3(); 

a o tym gdzie kamera patrzy, struktura rotation. Żeby było łatwiej, jest funkcja która wylicza rotation na podstawie współrzędnych miejsca na które chcemy by kamera spoglądała:

this.transform.LookAt(new Vector3(10, 10, 5)); 

Dodaj komentarz

Close Menu