Nie przejdziesz!

Problem: gracz może wyjść poza ekran.
Rozwiązanie: stworzenie bounding boxa o wielkości kamery, którego gracz nie będzie mógł przekroczyć. Przy próbie przejścia przez graniczne wartości powinien zostać zatrzymany.

Bounding Box

Bounding Box to po prostu kwadrat, otaczający obiekt. Dosłownie. Mówi nam gdzie znajduje się każdy z wierzchołków obiektu. Dzięki temu możemy wykryć czy przypadkiem nie najechał on na inny obiekt.

Gracz jest małym kwadracikiem, zamkniętym w większym. Jeśli będzie próbował z niego wyjść, powinien natrafić na ścianę. Czyli jeśli w następnym swoim ruchu przekroczyłby granicę – ustawiamy mu wartość na przekroczonej osi równą granicy.

Orthographic Camera

W grze stosujemy rzut kamery Orthographic. Jest to ‚płaska’ kamera. Patrząc na dwa obiekty obok siebie – nie będziemy w stanie stwierdzić który jest od nas dalej (chyba że na siebie najdą, wtedy bliższy zasłoni ten bardziej oddalony). Jej przeciwieństwem jest Perspective Camera. Perspektywa – im dalej, tym bardziej będzie pomniejszała obiekt.

Sprawdźmy co Unity mówi na temat właściwości orthographicSize w Manualu:

Camera’s half-size when in orthographic mode.

This is half of the vertical size of the viewing volume. Horizontal viewing size varies depending on viewport’s aspect ratio. Orthographic size is ignored when camera is not orthographic.
od Unity – Camera.orthographicSize

Mamy od ręki dostępną połówkę wysokości kamery. Idealnie.

Teraz potrzebujemy jeszcze szerokość. Powinniśmy ją liczyć według ekranu gracza. Przy proporcjach 16:9 mnożnik wynosi 1.(7), a przy 4:3 to 1.(3). Musimy tylko pomnożyć tę wartość przez pobraną już wysokość.

Mathf.Clamp

Jest to genialna funkcja, dostępna w większości bibliotek Math. Clamp przyjmuje 3 parametry: aktualny, minimalny i maksymalny. To ona ustawi nam granicę bounding boxa. Skrócona implementacja mogłaby wyglądać tak:

Jedyne o czym musimy pamiętać: dzięki Clampowi ustawiamy nową pozycję gracza. Pozycja to zawsze jego środek. Dlatego mając przykładowo wartość maksymalną kamery na osi X 10.0f, a szerokość gracza 1.0f – możemy mu pozwolić na dojście do punktu 9.5f na jego pozycji. Jest to współrzędna jego środka, doliczamy do niego prawą połówkę + 0.5f, co daje 10.0f.

Żeby trochę uprościć sprawę odwołamy się do posiadanego MeshFiltera. Posiada on właściwość mesh, która zawiera bounding box. Możemy tu pobrać jego size.x (tu: 1.0f), pozycję minimalną.x (-0.5f) lub maksymalną.x (0.5f), które są liczone od środka.

Skrypt

W tym poście to chyba skrypt będzie najprostszą częścią 🙂

Chciałbym teraz zrobić UI gracza, w sobotę wróci temat rozdzielczości.