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.
using UnityEngine;
[ExecuteInEditMode]
public class ScaleWidthCamera : MonoBehaviour {
public int targetWidth = 640;
public float pixelsToUnits = 100;
void Update() {
int height = Mathf.RoundToInt(targetWidth / (float)Screen.width * Screen.height);
camera.orthographicSize = height / pixelsToUnits / 2;
}
}
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
- 5: 4
- 4: 3
- 3: 2
- 16:10
- 16: 9
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.
Vector3 leftBottom = camera.ViewportToWorldPoint(new Vector3(0, 0, camera.nearClipPlane));
Vector3 rightTop = camera.ViewportToWorldPoint(new Vector3(1, 1, camera.nearClipPlane));
float left = leftBottom.x;
float bottom = leftBottom.y;
float right = rightTop.x;
float top = rightTop.y;
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 :)