Otrzymałem wiele odpowiedzi na to pytanie, ale wszystkie są ogólne i ogólnie niezbyt przydatne. Żaden z samouczków nie mówi o proporcjach obrazu i postępowaniu z urządzeniami mobilnymi, a jest na to zillion sposobów, wszystkie wydają się mieć wady i błędy.
Naprawdę chciałbym wiedzieć, jakie udane gry wykorzystują różne współczynniki proporcji na iOS i Androidzie bez tworzenia zillionów aktywów o różnej wielkości.
Ściśle mówiąc, jestem mobilny, a nie stacjonarny, szczególnie z Unity i nie dbam o interfejs użytkownika, zależy mi tylko na kanwie rozgrywki.
Mam na myśli problemy, gdy są kluczowe rzeczy, które muszą znajdować się w niektórych miejscach i nie mogą spaść z ekranu. Stosowanie czarnych pasków u góry lub u dołu jest obecnie niedopuszczalne.
źródło
Odpowiedzi:
To, co chcesz, to ograniczyć rzutnię kamery do portretu lub krajobrazu (w zależności od potrzeb), obliczając
camera.orthographicSize
właściwość, dzięki czemu możesz zbudować scenę 2D bez względu na proporcje i rozdzielczość:Jeśli potrzebujesz więcej informacji na ten temat, zapytaj, a ja odpowiem. ;) Pozdrawiam i na zdrowie.
AKTUALIZACJA: Użyj skryptu zakotwiczenia obiektów Eliota Lasha razem z tym, aby w razie potrzeby umieścić obiekty w kluczowych pozycjach na ekranie (względem rogów / ramek ekranu). Jeśli tak, zmień nazwę „CameraFit” na „ViewportHandler”.
Podgląd symulujący różne ekrany o proporcjach:
źródło
GetComponent<Camera>().orthographicSize = UnitSize / 2f;
do potrait / definiowania jednostek wysokościZwykle nie potrzebujesz różnych rozmiarów zasobów - importowane tekstury i duszki z automatycznie generowanymi mapami mip będą wyglądać ładnie, gdy będą renderowane w dowolnym rozmiarze mniejszym lub równym oryginalnemu rozmiarowi piksela obrazu.
Układ sceny jest wyzwaniem. Jedno dobre podejście jest następujące (i do twojej wiadomości używam kamery 3D, patrząc na zawartość 2D ustawioną na z = 0):
W formie kodu:
źródło
Jeśli zaczniesz korzystać z pasków, jest to dość proste do wdrożenia (piszę to, chociaż PO stwierdził, że jest to nie do przyjęcia, ponieważ ma tę zaletę, że nie jest tak źle na telefonie komórkowym i jest to proste rozwiązanie, które nie wymaga żadnego kodu)
Camera.orthographicSize
to zmienna w kamerze orto (używanej przez większość gier 2D), która pasuje do zmierzonej liczby jednostek gry pionowo na ekranie ( podzielona przez 2 ) ( źródło ). Dlatego wybierz proporcje, które pasują do większości urządzeń (wybrałem 16: 9, ponieważ większość ekranów, które badałem to 16: 9, 16:10, 3: 2) i dodaj maskę, która nakłada się na ten współczynnik.Przykład :
W mojej grze (nie wymienionej tutaj, ponieważ nie jest to reklama, w razie potrzeby mogę zapytać w komentarzach) używamy trybu portretowego. Aby zrobić ładny prosty 16: 9, zrobiłem moją kamerę Ortho w rozmiarze 16. Oznacza to, że kamera dostosuje 32 jednostki gry wysokości (w moim przypadku od 16 do -16) do pionu ekranu urządzenia.
Następnie umieściłem czarne maski w grze pomiędzy -9 a +9. Voila, ekran gry wygląda dokładnie tak samo na wszystkich urządzeniach, a nieco bardziej chudy na urządzeniach, które są nieco szersze. Nie miałem absolutnie żadnej negatywnej opinii na temat masek. Aby zrobić krajobraz, po prostu odwróć te wartości, a następnie stworzysz kamerę o rozmiarze 9. Zmień wartości, aby dopasować to, co zdecydowałeś, do skali jednostki gry.
Jedyne miejsce, w którym zaobserwowaliśmy znaczący czarny pasek, to iPad na 3: 2. Nawet wtedy nie miałem żadnych skarg.
źródło
Robię to w grze, nad którą obecnie pracuję. Mam obraz tła o wymiarach 1140 x 720. Najważniejsze bity (te, które nigdy nie powinny zostać przycięte) znajdują się w środkowym obszarze 960 x 640. Uruchamiam ten kod w funkcji uruchamiania mojego aparatu:
Określam również rozmiary inne niż rozmiar czcionki dla przycisków i tym podobne. Działa dobrze na każdym testowanym współczynniku proporcji. Minęło trochę czasu, odkąd go skonfigurowałem, więc być może brakuje mi kroku. Daj mi znać, jeśli to nie zadziała zgodnie z oczekiwaniami, a zobaczę, czy coś pominąłem.
źródło
@ Odpowiedź Marcela i kod są świetne i pomogły mi zrozumieć, co się dzieje. To ostateczna odpowiedź. Pomyślałem, że ktoś może również uznać za użyteczne to, co zrobiłem w moim konkretnym przypadku: ponieważ chciałem czegoś naprawdę bardzo prostego, jednego duszka zawsze na ekranie, wymyśliłem kilka wierszy:
Dodałem to do kamery i przeciągnąłem duszka (to moje tło) do jedynej właściwości skryptu. Jeśli nie chcesz żadnych czarnych pasków (poziomych lub pionowych), możesz umieścić za nimi większe tło ...
źródło
Istnieje kilka sposobów rozwiązania tego problemu i nie ma idealnego rozwiązania (przynajmniej jeszcze go nie znalazłem), a rodzaj rozwiązania, które wybierzesz, będzie w dużej mierze zależeć od rodzaju gry, w której grasz rozwijanie się.
Niezależnie od tego, co robisz, powinieneś zacząć od wybrania najniższej możliwej rozdzielczości, którą chcesz wesprzeć, i zbuduj duszki do tej rozdzielczości. Więc jeśli jesteś zainteresowany programowaniem na iOS, według http://www.iosres.com/ najniższa rozdzielczość urządzenia z iOS to 480x320.
Stamtąd możesz rozpocząć skalowanie duszków, aby spełnić wyższe rozdzielczości. Zastrzeżeniem tego jest to, że w końcu zaczniesz zauważać, że duszki zaczynają się rozmywać w dalszej skali, w którym to przypadku możesz przełączyć się na inny zestaw duszek zbudowany dla wyższych rozdzielczości.
Możesz też całkowicie zignorować skalowanie i po prostu zdecydować o wyświetleniu większej ilości ekranu gry dla wyższych rozdzielczości (uważam, że tak właśnie robi Terraria). Jednak w przypadku wielu gier nie jest to właściwe; na przykład gry konkurencyjne.
Czy to jest Robi to wiele gier, które chcą wymusić proporcje 4: 3. Ponieważ używasz Unity, możesz w tym celu skorzystać ze skryptu AspectRatioEnforcer .
źródło
Istnieje wiele sposobów rozwiązania tego problemu, zależy to od gry i tego, co będzie działać najlepiej. Na przykład w naszej grze Tyrant Unleashed po prostu stworzyliśmy szerokie mapy z nieistotnymi szczegółami po bokach, aby można było odcinać boki na węższych urządzeniach. Jednak inne gry mogą być lepsze z podejściem, w którym faktycznie przesuwasz przyciski lub coś, co lepiej pasuje do ekranu.
(Częścią naszego podejścia jest także utrzymywanie stałej wysokości na wszystkich urządzeniach, zmieniając jedynie szerokość. To z pewnością ułatwia nam życie, ale znowu może to, ale nie musi, być dobre dla twojej konkretnej gry. To nie ma znaczenia nasz styl artystyczny, jeśli obrazy są nieco skalowane na różnych ekranach, podczas gdy może to mieć znaczenie w przypadku sztuki pikselowej. Zasadniczo jest to podejście „pozwól Unity sobie z tym poradzić”)
źródło
Korzystam z następującego skryptu, który dodaje
targetAspect
parametr do kamery i dostosowuje goorthographicSize
w stosunku do proporcji ekranu (więcej szczegółów w tym poście na blogu ):źródło
Moja metoda jest w większości podobna do rozwiązań podanych przez innych :) Postaram się szczegółowo wyjaśnić, jak podchodzę do uniezależnienia gry od rozmiaru ekranu.
Orientacja ekranu
W zależności od orientacji ekranu (pozioma lub pionowa) należy rozważyć, czy kamera będzie skalować ze stałą wysokością lub stałą szerokością. Najczęściej wybieram stałą szerokość dla gier zorientowanych na krajobraz i stałą wysokość dla gier zorientowanych na portret.
Skalowanie kamery
Jak omówiono, może to być stała wysokość lub stała szerokość.
Naprawiono wysokość : pionowy obszar gry zawsze będzie pasował do wysokości ekranu. Wraz ze zmianą proporcji ekranu po lewej i prawej stronie ekranu zostanie dodane dodatkowe miejsce. Aby to zaimplementować, nie trzeba niczego kodować, jest to domyślne zachowanie kamery unity.
Naprawiona szerokość : Poziomy obszar gry zawsze będzie pasował do szerokości ekranu. Dodatkowe miejsce zostanie dodane na górze i na dole wraz ze zmianą proporcji ekranu. Aby to zaimplementować, musisz napisać mały fragment kodu. Później upewnij się, że usunąłeś funkcję aktualizacji formularza kodu i wstawiłeś go w stan czuwania.
W edytorze możesz zmienić targetWidth, aby zdefiniować obszar kosmiczny, który chcesz wyświetlić. Ten kod jest wyjaśniony w poniższym filmie wraz z wieloma innymi ćwiczeniami dla gier 2D :)
Unite 2014 - Najlepsze praktyki 2D w jedności
Proporcje obrazu
Poniższy współczynnik proporcji, od najszerszego do najwęższego, obejmuje prawie wszystkie rozmiary ekranu dla Androida i iOS
Zazwyczaj wszystkie te współczynniki kształtu ustawiam w podanej kolejności pod oknem gry, ponieważ jest to przydatne podczas testowania różnych rozmiarów ekranu :)
Obszar wydatkowy
Jest to obszar, który jest dodawany do ekranu po bokach lub u góry / u dołu, w zależności od wybranego skalowania kamery.
Dla stałej wysokości wszystkie elementy gry powinny najlepiej pasować do proporcji 16: 9, która jest najwęższa. Tło powinno się rozciągać, aż obejmie stosunek 5: 4. Dzięki temu Twoja gra nigdy nie ma czarnych pasów po bokach.
Dla stałej szerokości jest prawie taka sama, ale tutaj elementy powinny pasować w stosunku 5: 4, a BG powinien rozciągać się do 16: 9.
Miedza
Czasami nie możemy zastosować podejścia do obszaru zbywalnego, ponieważ musimy wykorzystać cały dostępny ekran do gry.
Weźmy na przykład grę portretową o stałej wysokości, łapiąc spadające z nieba monety. W tym musimy umożliwić graczowi poruszanie się w poziomie na dostępnej szerokości ekranu.
Dlatego potrzebujemy granic kamery pod względem współrzędnych świata, aby wiedzieć, gdzie dokładnie lewa, prawa, górna lub dolna część klipów kamery w pozycji na świecie.
Możemy również użyć tych granic do zakotwiczenia elementów gry lub interfejsu użytkownika do pożądanej strony kamery.
Za pomocą Camera.ViewportToWorldPoint możemy uzyskać granice. Przestrzeń widoku jest znormalizowana w stosunku do kamery. Lewy dolny róg kamery to (0,0); prawy górny róg to (1,1). Pozycja Z znajduje się w jednostkach światowych z kamery. Dla 2D / ortografii z nie ma znaczenia.
Interfejs użytkownika
W przypadku interfejsu użytkownika możemy zastosować te same koncepcje, których użyliśmy do elementów gry. Po wprowadzeniu Unity5 UI i dostępności wtyczek takich jak NGUI nie będzie większego problemu :)
źródło
Stworzyłem Unity Asset 'Resolution Magic 2D', aby rozwiązać ten bardzo problem (reklama: możesz go pobrać ze sklepu Unity Asset Store lub zobaczyć więcej szczegółów na grogansoft.com).
Sposób rozwiązania tego problemu był następujący ...
Zdefiniuj obszar ekranu, który musi być zawsze widoczny, niezależnie od proporcji / rozdzielczości, i użyj prostej transformacji prostokąta, aby „rozrysować” ten region. To jest twój idealny kształt ekranu. Za pomocą prostego algorytmu powiększam następnie kamerę, aż obszar zablokowany przez prostokąt będzie tak duży, jak to możliwe, a jednocześnie będzie w 100% widoczny dla kamery.
Zatem główny obszar gry zawsze zajmuje jak najwięcej ekranu. I tak długo, jak istnieje wystarczająca „dodatkowa” zawartość (np. Tło) poza zdefiniowanym wcześniej obszarem prostokąta, gracze, których ekran nie ma takiego samego współczynnika proporcji jak Twój „idealny” prostokąt, zobaczą dodatkową zawartość, w której czarne paski inaczej iść.
Mój zasób zawiera również logikę do umieszczania interfejsu użytkownika, ale jest to w większości przestarzałe ze względu na nowy system interfejsu użytkownika Unity.
Mój zasób zapewnia to po wyjęciu z pudełka przy minimalnej konfiguracji i działa naprawdę dobrze na wszystkich platformach.
Jeśli używasz tej techniki (lub mojego zasobu), po prostu upewnij się, że projektujesz grę tak, aby wokół miała „opcjonalną” przestrzeń, aby pomieścić ekrany szersze lub wyższe niż Twoje (w celu uniknięcia czarnych pasków).
Nie tworzę osobiście gier 3D, więc nie wiem, czy to zadziała w 3D (czy nawet jest konieczne).
Naprawdę trudno to wytłumaczyć bez zdjęć, więc proszę odwiedzić moją stronę internetową ( Resolution Magic 2D )
źródło
Najlepszym rozwiązaniem jest dla mnie użycie twierdzenia o przecinających się liniach, aby nie było po bokach odcięcia ani zniekształcenia widoku gry. Oznacza to, że musisz cofnąć się do przodu lub do przodu w zależności od różnych współczynników kształtu.
źródło
Stworzyłem rozszerzenie AssetStore, które pozwala na łatwiejsze przełączanie aspektów o nazwie AspectSwitcher . Zapewnia system umożliwiający łatwe określenie różnych właściwości dla różnych aspektów. Zasadniczo są dwie metody, których większość ludzi używa do zmiany aspektów. Jednym z nich jest zapewnienie różnych obiektów gry dla każdego aspektu. Drugim jest stworzenie niestandardowego kodu, który modyfikuje właściwości pojedynczego obiektu gry na podstawie bieżącego aspektu. Zwykle wymaga to dużo niestandardowego kodowania. Moje rozszerzenie próbuje złagodzić wiele tego bólu.
źródło