Perché Unity in modalità 2d utilizza il ridimensionamento e la dimensione otografica predefinita come fa?


8

In precedenza ho usato SFML, XNA, Monogame, ecc. Per creare giochi 2D, dove se visualizzo uno sprite 100px sullo schermo, occuperà 100px . Se uso le tessere 128px per creare uno sfondo, la prima tessera sarà su (0, 0) mentre la seconda sarà su (128, 0).

D'altra parte, l'unità ha il suo sistema di unità dispari, il ridimensionamento su tutte le trasformazioni, i pixel in unità, le dimensioni otografiche, ecc. Ecc. Quindi la mia domanda è duplice, vale a dire:

  1. Perché Unity ha questo sistema di default per 2d? È per gli sviluppatori mobili? C'è un grande vantaggio che non vedo?
  2. Come posso configurare il mio ambiente, in modo che se ho uno sprite 128x128 in Photoshop, questo venga visualizzato come sprite 128x128 in Unity quando eseguo il gioco?

Nota che sto prendendo di mira esclusivamente il desktop.


1
Perché questo accade è perché Unity era un motore 3D che recentemente aveva innestato la grafica 2D. Come gestire tutto, tuttavia è qualcosa a cui sarei curioso di vedere le risposte, per vedere se qualcun altro ha un approccio migliore di me.
jhocking

Le funzioni GUI di Unity e il componente GUITexture ti consentono di disegnare trame sullo schermo a dimensione nativa, direttamente. docs.unity3d.com/Documentation/ScriptReference/GUI.html docs.unity3d.com/Documentation/Components/class-GuiTexture.html Se hai bisogno di maggiore flessibilità, la soluzione migliore è definire una scala coerente - come 1U = 128px - e applicalo costantemente a tutti i tuoi quad / sprite / telecamere.
DMGregory

Eviterei la classe GUI di Unity; poiché la GUI in modalità immediata in Unity è piuttosto inefficiente, stanno costruendo un nuovo sistema di GUI (in procinto di rilasciarlo effettivamente, nella versione 4.6).
jhocking

Risposte:


4

Gestire le coordinate 2D e ridimensionare in Unity è abbastanza semplice, ma non ovvio e come hai notato è diverso da come funzionano gli altri strumenti di sviluppo. Perché questo accade è perché Unity era un motore 3D che recentemente aveva innestato la grafica 2D.

In particolare, 1 unità in Unity non è necessariamente 1 pixel nell'immagine. Quando si importano immagini come Sprite 2D, in realtà esiste un'impostazione da Pixel a Unità che potrebbe essere configurata 1: 1 ma consiglio di lasciarla al valore predefinito 100: 1 per un paio di motivi (il motore fisico non funziona esattamente a 1: 1 e il valore predefinito è migliore per la compatibilità con il codice altrui).

Questa impostazione di ridimensionamento significa che tutte le posizioni sono divise per 100. È abbastanza facile purché si ricordi sempre il ridimensionamento; quando vuoi spostare uno sprite di 256 pixel (diciamo) poi lo sposti 2.56 Puoi anche scrivere una funzione di utilità per arrotondare i numeri a 2 cifre decimali / il pixel più vicino: Mathf.Round (float * 100) / 100f


Per quanto riguarda l'impostazione di una fotocamera pixel-perfetta, innanzitutto impostala come una fotocamera ortografica. Quando si seleziona la fotocamera, nelle sue impostazioni è presente un menu a discesa per Prospettiva o Proiezione ortografica; prospettiva significa che le cose sembreranno 3D, mentre ortogonale mostra la scena piatta. Proprio sotto questo menu a discesa c'è Dimensione; imposta le dimensioni ortografiche della fotocamera su metà delle dimensioni in pixel dello schermo che desideri.

Ad esempio, supponiamo che tu voglia uno schermo 1024x768 pixel perfetto. Bene, ciò significa che l'altezza della fotocamera dovrebbe essere di 384 pixel. Dividilo per 100 (a causa della scala da pixel a unità) e otterrai 3,84 per le dimensioni della videocamera. Ancora una volta, quella matematica è semplicemente SCREEN_SIZE / 2 / 100f


(Stavo aspettando di vedere quali altre risposte arrivano prima, ma sono passati un paio di giorni. Ho fatto 2D in Unity per un po 'usando 2D Toolkit , ma sono relativamente nuovo alle funzionalità 2D integrate)


2

Come dice il jhocking, è il risultato di un pattinaggio in 2D in un IDE 3D. Ma c'è una soluzione, è solo un po 'arcana.

Il primo passo è aprire le Impostazioni di importazione di sprite dal riquadro Progetto. Una volta che il Tipo di trama è impostato su Sprite o Avanzato (Avanzato ti offre altre opzioni utili, ma Sprite è predefinito se hai creato un progetto 2D all'inizio), c'è un campo Pixel a Unità con un valore predefinito di 100.

Sto scherzando con un sistema di tessere, quindi sto usando tessere 16x16 pixel e impostando Pixel su Unità su 16. La matematica funziona così: Dimensione in pixel (X o Y) / Pixel in Unità = Unità di unità in Trasforma . Il cubo da 16 pixel con PTU 16 occupa 1 unità nello spazio Unity.

Non ho ancora provato, ma mi aspetto che un PTU di 1 renderebbe le cose pixel perfette.

L'impostazione della fotocamera ortografica è un po 'un mal di testa. Ancora una volta, si basa sull'impostazione Pixel a Unità, ma anche alcune altre cose. Fondamentalmente è metà dell'altezza dello schermo dalle Impostazioni del giocatore (cioè 1080, 768, qualunque sia l'iPhone 5, non può essere disturbato a cercarlo) diviso per Pixel per Unità.


1

Le unità pixel non sono un buon modo per rappresentare mondi di grandi dimensioni a causa del modo in cui funzionano i numeri in virgola mobile. Con numeri in virgola mobile, si perde precisione con numeri molto grandi. I numeri vicini a 0 hanno la massima precisione. Pertanto, alcuni motori di gioco tendono a preferire il sistema di metriche MKS (metri / chilogrammi / secondi). L'unità è impostata per impostazione predefinita sui metri, quindi i personaggi del gioco possono essere facilmente rappresentati con un'altezza di 1,0-2,0 metri con un'ottima precisione.

Il peso e l'altezza medi di un maschio umano sono alti circa 50 kg e 1,8 metri. Se provassi a creare un personaggio alto 1200 pixel, il suo peso sarebbe di circa 33.000 pixel unità. Se poi volessi aggiungere un oggetto molto pesante come un autobus a un gioco, avresti un numero enorme di unità pixel. Si può facilmente vedere come questo potrebbe portare a calcoli molto imprecisi per le collisioni.

Se sei molto determinato a utilizzare le unità di pixel, puoi facilmente calcolare il rapporto pixel / metri.


Ma tutto ciò non si applica alla maggior parte dei giochi 2D che non hanno nemmeno bisogno di usare la fisica. Il problema è che Unity suggerisce il supporto per il 2D ma è molto rudimentale e richiede molto studio per semplificare ciò che è veramente necessario da un motore 2D.
Kokodoko,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.