Il mio metodo è per lo più simile alle soluzioni fornite da altri :) Cercherò di spiegare in dettaglio l'approccio che prendo per rendere il gioco indipendente dalle dimensioni dello schermo.
Orientamento schermo
A seconda dell'orientamento dello schermo (Orizzontale o Verticale), è necessario considerare se la fotocamera verrà ridimensionata con un'altezza fissa o larghezza fissa. Principalmente scelgo la larghezza fissa per i giochi orientati al paesaggio e l'altezza fissa per i giochi orientati al ritratto.
Ridimensionamento della fotocamera
Come discusso, questo può essere un'altezza fissa o una larghezza fissa.
Altezza fissa : l'area verticale del gioco si adatterà sempre all'altezza dello schermo. E man mano che le proporzioni dello schermo cambiano, verrà aggiunto ulteriore spazio a sinistra e a destra dello schermo. Per implementare questo non è necessario codificare nulla, è il comportamento predefinito di Camera Camera.
Larghezza fissa : l'area orizzontale del gioco si adatta sempre alla larghezza dello schermo. E lo spazio aggiuntivo verrà aggiunto in alto e in basso man mano che le proporzioni dello schermo cambiano. Per implementare questo è necessario scrivere un piccolo pezzo di codice. Successivamente, assicurarsi di rimuovere la funzione di aggiornamento del modulo di codice e di metterlo in stato di attivazione.
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;
}
}
Nell'editor è possibile modificare targetWidth per definire l'area dello spazio mondiale che si desidera visualizzare. Questo codice è spiegato nel seguente video insieme a molte altre pratiche per i giochi 2D :)
Unite 2014 - Best practice 2D in unità
Proporzioni
Le seguenti proporzioni, elencate dal più ampio al più stretto, coprono quasi tutte le dimensioni dello schermo sia per Android che per iOS
- 5: 4
- 4: 3
- 3: 2
- 16:10
- 16: 9
Di solito imposto tutte queste proporzioni nell'ordine indicato sotto la finestra di gioco, poiché è utile durante il test per schermi di dimensioni diverse :)
Area spendibile
Questa è l'area che viene aggiunta allo schermo ai lati o in alto / in basso a seconda del ridimensionamento della fotocamera che hai scelto.
Per un'altezza fissa, tutti gli elementi del gioco dovrebbero preferibilmente adattarsi nel rapporto 16: 9 che è il più stretto. E lo sfondo dovrebbe estendersi fino a coprire il rapporto 5: 4. Il che assicura che il tuo gioco non abbia mai strisce nere ai lati.
Per larghezza fissa è quasi lo stesso, ma qui gli elementi dovrebbero adattarsi nel rapporto 5: 4 e il BG dovrebbe estendersi fino a 16: 9.
misura
A volte non possiamo usare l'approccio dell'area sacrificabile in quanto dobbiamo utilizzare l'intero schermo disponibile per il gioco.
Ad esempio, considera un gioco ritratto con altezza fissa, catturando le monete che cadono dal cielo. In questo dobbiamo dare al giocatore la possibilità di muoversi orizzontalmente sulla larghezza dello schermo disponibile.
Quindi abbiamo bisogno dei limiti della fotocamera in termini di coordinate mondiali per sapere dove esattamente la sinistra, la destra, la parte superiore o inferiore delle clip della fotocamera nella posizione mondiale.
Possiamo anche usare questi limiti per ancorare gli elementi del gioco o l'interfaccia utente a un lato desiderato della telecamera.
Usando Camera.ViewportToWorldPoint possiamo ottenere i limiti. Lo spazio di visualizzazione è normalizzato e relativo alla telecamera. L'angolo in basso a sinistra della telecamera è (0,0); l'angolo in alto a destra è (1,1). La posizione z è espressa in unità mondiali dalla fotocamera. Per 2D / ortografica la z non ha importanza.
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;
UI
Per l'interfaccia utente possiamo applicare gli stessi concetti che abbiamo usato per gli elementi di gioco. Dopo l'introduzione dell'interfaccia utente di Unity5 e la disponibilità di plugin come NGUI questo non sarà un grosso problema :)