Czy Unity 2D można wykorzystać do tworzenia gier pikselowych?

16

Patrzę na nowe funkcje 2D wprowadzone w Unity 4.3 i myślę, że czegoś mi brakuje.

Dla mnie wygląda na to, że są przeznaczone do gier 2D o wysokiej rozdzielczości, w których skalowanie duszków jest w porządku, ale nie nadaje się do gier pikselowych.

Duszek pixel-art został zaprojektowany tak, aby wyświetlać dokładnie 1: 1 piksele na ekranie: skalowanie niszczy go (wyjątek stanowi liniowe skalowanie w górę, tzn. Możesz skalować go 2x, 3x, 4x itd.).

Jednak nie znalazłem sposobu, aby „po prostu wyświetlić go takim, jakim jest”, najwyraźniej Unity nalega na skalowanie go do dowolnej rozdzielczości, jaką uzna za stosowną: mogę kontrolować parametr Camera.size i parametr „pikseli na jednostki” duszka , ale nie udało mi się uzyskać tego wyniku.

o0 ”.
źródło
1
Jeśli się nie mylę, gra „Organ Trail” została stworzona w całości na Unity3d przed 4.3.
Felipe,

Odpowiedzi:

19

W tym artykule podano kilka przydatnych wyjaśnień, nawet jeśli było to wcześniej niż 4.3:

Jeśli szukasz wyglądu „pixel art”, rozmiar ortografii aparatu ma kluczowe znaczenie; jest to najtrudniejsza część gwoździowania 2D w Unity.

Rozmiar ortograficzny wyraża liczbę jednostek świata zawartych w górnej połowie projekcji kamery. Na przykład, jeśli ustawisz rozmiar ortograficzny na 5, wówczas pionowe zakresy rzutni będą zawierać dokładnie 10 jednostek przestrzeni świata. (Zakresy poziome zależą od współczynnika kształtu wyświetlacza.)

Przypomnij sobie, że twój sprite quad ma 1 jednostkę na bok. Oznacza to, że rozmiar ortograficzny mówi, ile duszków można ułożyć pionowo w rzutni (podzielone przez 2).

Aby renderowanie pikselowego wyglądu wyglądało czysto, musisz upewnić się, że każdy piksel źródłowej tekstury duszka mapuje 1: 1 na ekran rzutni. Nie chcesz, aby piksele źródłowe były pomijane lub podwajane, bo twoje duszki będą wyglądały na zniekształcone i „brudne”. Sztuczka zapewniająca ten stosunek 1: 1 polega na ustawieniu rozmiaru ortograficznego, który odpowiada pionowej rozdzielczości ekranu podzielonej przez wysokość piksela duszka.

Załóżmy, że korzystasz z formatu 960 x 640 i używasz duszków 64 x 64. Dzielenie pionowej rozdzielczości ekranu (640) przez wysokość piksela duszka (64) daje 10, liczbę 64x64 duszek, które można ułożyć pionowo w 640 pikseli. Pamiętaj, że rozmiar ortograficzny ma połowę wysokości, więc docelowy rozmiar ortograficzny w tym przypadku będzie wynosić 5 (połowa z 10). To powinno wyglądać tak:

Jeśli ustawisz swój rozmiar ortograficzny na połowę lub podwojony cel, nadal możesz uzyskać użyteczne wyniki, ponieważ rozmiar pionowy duszka będzie nadal dzielił się równomiernie na rozmiar pionowy rzutni. Ale jeśli niepoprawnie ustawisz rozmiar ortograficzny, zobaczysz, że niektóre piksele zostały pominięte lub podwojone, i rzeczywiście będzie wyglądać bardzo źle:

Zmienna rozdzielczość

Nie musisz ograniczać się do jednej, stałej rozdzielczości, aby renderować czyste piksele. Najprostszym sposobem obsługi zmiennych rozdzielczości jest dołączenie do aparatu niestandardowego skryptu, który ustawia rozmiar ortograficzny zgodnie z bieżącą rozdzielczością pionową i znanym (stałym) rozmiarem duszka :

// set the camera to the correct orthographic size
// (so scene pixels are 1:1)
s_baseOrthographicSize = Screen.height / 64.0f / 2.0f;
Camera.main.orthographicSize = s_baseOrthographicSize;

Chociaż jest to prosta poprawka, ma ona tę wadę, że wraz ze spadkiem rozdzielczości ekranu będzie coraz mniej świata, a duszki zajmą coraz więcej ekranu. Jest to konsekwencja utrzymania stosunku 1: 1 między pikselami źródłowymi i ekranowymi: duszek 64x64 zajmuje bardziej pozorną przestrzeń przy 640x480 niż 1920x1200. To, czy jest to problem, czy nie, zależy od potrzeb konkretnej gry.

Jeśli chcesz, aby duszki pozostawały w tym samym pozornym rozmiarze niezależnie od rozdzielczości ekranu, po prostu ustaw rozmiar ortograficzny na stałą wartość i pozostaw go tam bez względu na rozdzielczość ekranu. Wadą jest to, że twoje duszki nie będą już miały stosunku pikseli do ekranu 1: 1. Możesz złagodzić złe skutki tego, dopuszczając tylko rozdzielczości, które są dokładnie o połowę lub dokładnie dwukrotnie wyższe od rozdzielczości docelowej.

(dodano pewne podkreślenie)

To oczywiście działa lepiej, jeśli rozdzielczość wysokości jest podzielna przez rozmiar duszka, ale nawet jeśli nie jest, nadal daje dobre przybliżenie przyzwoitego wyniku.


TL; DR :cameraSelf.orthographicSize = screenH / (float)spriteSize / 2f;

o0 ”.
źródło
5
Kolejną przydatną rzeczą jest ustawienie filtrowania tekstur na „Punkt”.
felipe
@Felipe dobry punkt: zapomniałem o tym, ponieważ już to rozgryzłem.
o0 ”.