Come configurare smartphone e PC. Portale informativo
  • casa
  • Ferro
  • Unreal vs Unity: qual è il miglior strumento di sviluppo di giochi per dispositivi mobili? Risultati dell'analisi comparativa. Frequenza dei fotogrammi

Unreal vs Unity: qual è il miglior strumento di sviluppo di giochi per dispositivi mobili? Risultati dell'analisi comparativa. Frequenza dei fotogrammi

Nelle lezioni precedenti, abbiamo modellato e strutturato terreni, edifici ed esterni. Come combinare ora tutti questi oggetti in un'unica scena e disporli nei posti giusti? Dove trovare gli oggetti mancanti: automobili, alberi, cespugli, fiori? Lo impareremo in questa lezione.

In questo tutorial, inseriremo oggetti nella scena usando il comando Unisci(Combina) e disponi questi oggetti con i controller Elenco posizioni(Controllore di posizione nell'elenco), Vincolo di percorso(Limitazione lungo il percorso), strumento Istantanea(Tipo di oggetto) tramite plugin Multiscatter e il suo modulo Multipittore, e impara anche a tradurre gli oggetti in Oggetti proxy.

1. Inserimento di oggetti da altri file.

1. Apriamo il file con il paesaggio. È in questo file che inseriremo tutti gli altri oggetti e li disporremo sul paesaggio dipinto.

2. Inseriamo edifici. Per farlo, vai al menu File(File)> fai clic sulla freccia accanto al pulsante Importare(Importa)> Unisci(Combina) (Fig. 1).

Riso. 1. Utilizzo del comando Unisci

3. Nella finestra che si apre, seleziona il file desiderato e fai clic su Aprire(Apri) (Fig. 2).


Riso. 2. Selezione del file desiderato

4. Apparve una finestra Unisci(Combina), che elenca i nomi di tutti gli oggetti dal file allegato. Abbiamo solo bisogno di edifici. Per selezionare solo gli oggetti di cui abbiamo bisogno, fai clic su di essi tenendo premuto il tasto Ctrl... Spingere ok(fig.3).


Riso. 3. Selezione degli oggetti richiesti

Gli oggetti selezionati vengono inseriti nella scena del paesaggio (Fig. 4).


Riso. 4. Inserimento di oggetti

Esercizio 1

Inserisci tu stesso tutti gli elementi esterni nello stesso file (Fig. 5).


Riso. 5. Inserimento di oggetti esterni

Nota: se hai posizionato tutti gli oggetti sui tuoi livelli, quando incolli questi oggetti in un altro file, anche i livelli verranno copiati. Pertanto, se hai creato coscienziosamente i livelli come descritto nelle lezioni, ora hai Gestisci livelli(Layer manager) devono essere presenti layer come in Fig. 6.


Riso. 6. Visualizzazione del gestore dei livelli

2. Inserimento di oggetti da librerie di modelli già pronti

Nelle lezioni precedenti abbiamo imparato a modellare molti degli oggetti di cui abbiamo bisogno. Ma ci sono tali oggetti, la cui modellazione richiederà molto tempo, o per crearli è necessaria una conoscenza molto approfondita del programma, o semplicemente non ha senso modellarli, perché esistono già e puoi semplicemente scaricarli . Questi oggetti includono automobili, alberi, cespugli, fiori, ecc.

Esistono molti siti da cui è possibile scaricare modelli simili, ad esempio:

  • http://www.3dklad.com/ ecc.

Inoltre, alcuni modelli già pronti possono essere scaricati dalla sezione "Libreria" di questo sito.

Tali librerie di modelli già pronti inducono i visualizzatori alle prime armi a assemblare una scena in modo rapido e semplice, inserendo in essa modelli più o meno adatti dalla collezione. Ma fai molta attenzione, perché potrebbe esserci un problema di risorse hardware insufficienti nella fase finale del lavoro. Ciò è dovuto al fatto che i modelli scaricati possono avere un numero enorme di poligoni.

    Innanzitutto, durante la ricerca di modelli, assicurati che i materiali del modello corrispondano al renderer in cui stai lavorando (VRay).

    In secondo luogo, dopo il download, non inserire immediatamente il modello nella scena, ma aprirlo in una scena separata e salvare il modello da tutte le cose non necessarie che non saranno chiaramente visibili. Ha senso rimuovere o rimodellare del tutto alcuni elementi, perché i modellisti raramente si preoccupano di ridurre al minimo il loro prodotto.

Solo dopo puoi inserire in sicurezza il modello nella tua scena senza paura di sovraccaricarlo.

Compito 2

Scarica, controlla e incolla ( Importa> Unisci) nei nostri modelli di scena di alberi, cespugli, fiori, pietre, automobili e altro a tua discrezione (Fig. 7).


Riso. 7. Inserimento dei modelli finiti

Assicurati di creare livelli per questi oggetti e posizionali ciascuno sul proprio livello (Fig. 8).


Riso. 8. Visualizzazione del gestore dei livelli

3. Disposizione "manuale" degli oggetti

Per una regolazione più accurata e fine della scena, è molto conveniente utilizzare il metodo manuale di posizionamento degli oggetti. Pertanto, organizzeremo edifici, panchine, bidoni della spazzatura, segnali stradali, fiori e pietre per aiuole, automobili nel modo più consueto - "manualmente", semplicemente trascinandoli con il mouse usando lo strumento Seleziona e sposta(Seleziona e sposta). Otteniamo gli oggetti mancanti copiandoli con il tasto premuto. Cambio... Seleziona il tipo di copia Esempio(Campione) (Fig. 9).


Riso. 9. Copia oggetti mancanti

Di conseguenza, dovremmo ottenere la scena come in Fig. 10, fig. undici.


Riso. 10. Vista della scena dopo il posizionamento "manuale" degli oggetti


Riso. 11. Oggetti disposti

4. Posizionamento "automatico" di oggetti tramite controller, traduzione in Proxy e strumento Snapshot

Ci sono oggetti che devono essere disposti con una certa regolarità, ad esempio lanterne, tralicci, cespugli in motivi splendidamente "tagliati". Pertanto, prenderemo in considerazione un modo per automatizzare il processo di posizionamento degli oggetti.

1. Selezionare un oggetto, ad esempio una lanterna.

2. Traduciamo la torcia in Oggetto proxy... L'oggetto proxy diventa, per così dire, un riferimento a un oggetto che a sua volta si trova altrove. Ciò contribuirà a ridurre il carico pesante sul programma e sulla scheda video e ridurrà il requisito per l'allocazione della RAM. Ciò consentirà di utilizzare milioni e persino miliardi di poligoni nella scena su computer ordinari, che è la soluzione migliore per risolvere il nostro compito di creare una città.

Formuleremo i prerequisiti per il trasferimento di un oggetto a Oggetto proxy.

    Se un oggetto è composto da più parti componenti, allora devono essere combinate usando il comando Allegare in un oggetto.

    Tutte le trame dovrebbero essere già applicate all'oggetto.

Solo dopo che queste condizioni sono soddisfatte, l'oggetto può essere trasferito a proxy... Per fare ciò, fare clic con il tasto destro sull'oggetto e selezionare il comando Esportazione mesh V-Ray(Esporta sulla superficie V-Ray) (Fig. 12).


Riso. 12. Trasferimento di un oggetto a Proxy

Nella finestra aperta nel campo Cartella(Cartella) specificare il percorso in cui salvare l'oggetto Proxy (si consiglia di creare una cartella per gli oggetti Proxy nella cartella del progetto in modo che gli oggetti Proxy non vadano persi quando si lavora sul progetto su un altro computer). in campo File(File) impostare un nome per l'oggetto proxy o lasciarlo come predefinito. Assicurati di selezionare la casella Crea automaticamente proxy(Crea proxy automaticamente) e fare clic su ok(fig. 13).


Riso. 13. Parametri per il trasferimento di un oggetto a un proxy

L'oggetto cambierà il suo aspetto. Questa è un'altra caratteristica degli oggetti Proxy per facilitare il carico. L'oggetto può apparire come una scatola, come una mesh oscura, o in generale come un punto, ecc. - a seconda dei parametri di visualizzazione selezionati nei parametri dell'oggetto Proxy - ma dopo il rendering assumerà la sua forma reale (Fig. 14).


Riso. 14. Visualizzazione e visualizzazione semplificate degli oggetti

3. Controlla se hai Punto di rotazione(Punto di ancoraggio, perno dell'oggetto e punto di ridimensionamento) alla base dell'oggetto. Ora, per impostazione predefinita, il punto è nel mezzo della lanterna. Ha bisogno di essere spostato alla sua base. Per farlo, vai alla scheda Gerarchia(Gerarchia) e selezionare Influenza solo pivot(Influenza sul punto di ancoraggio). Ora usando Seleziona e sposta(Seleziona e sposta) e Scatta 3 possiamo spostare il punto di ancoraggio (Fig. 15). Dopodiché, non dimentichiamo di uscire dalla modalità di modifica.


Riso. 15. Spostamento del punto di articolazione

4. Creiamo in anticipo un percorso lungo il quale le lanterne saranno equidistanti. Nel nostro caso, basta creare Cerchio intorno al parco, come in Fig. sedici.


Riso. 16. Creare un percorso

5. Assegna una lanterna controllori... Questo concetto si riferisce all'animazione in 3Ds Max. Con l'aiuto dei controller, lo sviluppatore di grafica tridimensionale può controllare in modo flessibile il cambiamento del parametro animato degli oggetti. I controller di animazione sono vincoli preimpostati, in base ai quali è possibile modificare i parametri. In questo tutorial, non utilizzeremo i controller per l'animazione, ma per posizionare gli oggetti.

Seleziona la lanterna e vai alla scheda Movimento(Movimento). Apriamo la pergamena Assegna controller(Assegna un controller), seleziona una riga Posizione: posizione XYZ(Posizione: posizione XYZ) e fare clic sul pulsante di assegnazione del controller. Dall'elenco che si apre, seleziona Elenco posizioni(Elenco controllore di posizione). Questo controller ti consente di combinare diversi controller indipendenti contemporaneamente per creare un'animazione generale e questo ci sarà utile in futuro.


Riso. 17. Scopo del responsabile dell'elenco delle posizioni

Dopo aver applicato questo controller nelle liste Posizione: Elenco posizioni> Posizione XYZ: Posizione XYZ apparirà una linea A disposizione(Disponibile), che consente di aggiungere nuovi controller all'elenco. Seleziona questa riga e premi di nuovo il pulsante Assegna controller... Nella finestra di dialogo che si apre, questa volta seleziona Vincolo di percorso(Restrizione lungo il percorso). Questo controller vincola il movimento dell'oggetto lungo il percorso, che è la spline specificata. Questo controller viene utilizzato per animare oggetti lungo percorsi complessi (ad esempio, il movimento di un'auto sulla strada). premere ok(fig. 18).


Riso. 18. Scopo del controller Path Constraint

Ora più in basso, in una pergamena Elenco posizioni evidenziare Vincolo di percorso e clicca sul pulsante Imposta attivo(Rendere attivo). in una pergamena Parametri del percorso(Parametri percorso) fare clic sul pulsante Aggiungi percorso(Assegna percorso) e selezionare il percorso creato in precedenza. Assicurati di selezionare la casella accanto a Seguire(Seguire), selezionare l'asse desiderato, se necessario, rifletteremo utilizzando Flip(Flip). La lanterna si sposterà all'inizio del percorso (Fig. 19).


Riso. 19. Assegnazione del percorso

6. Se avvii l'animazione ora, la lanterna si sposterà esattamente lungo il percorso. Ma tutte queste azioni con l'assegnazione dei controller ora non erano per amore dell'animazione, ma in modo che l'oggetto segua chiaramente il percorso di cui abbiamo bisogno. Ora capirai perché ne avevamo bisogno.

Dal menu principale Utensili(Strumenti) seleziona uno strumento Istantanea(Tipo oggetto) (Fig. 20). È progettato per creare una serie di oggetti lungo il percorso di animazione dell'oggetto originale (nel nostro caso, l'animazione della lanterna lungo il percorso).


Riso. 20. Posizione dello strumento Istantanea

Nella finestra che si apre, spunta la casella qui a fianco Gamma(Lungo la traiettoria), lasciamo i valori da da 0 a 100, copie(Numero di copie) impostato a nostra discrezione. Seleziona il metodo di copia Esempio(Esempio) e fare clic su ok... Vedremo subito come le lanterne si posizionano automaticamente lungo la traiettoria che abbiamo disegnato (Fig. 21).


Riso. 21. Utilizzo dello strumento Istantanea

Resta un punto importante. È necessario rimuovere quella lanterna originale con l'animazione, altrimenti si sposterà in cerchio sul nostro video di presentazione. È molto semplice farlo: è attualmente selezionato, quindi, senza rimuovere la selezione, premere il pulsante Eliminare sulla tastiera.

Se una lanterna è nel posto sbagliato, puoi sempre spostarla "manualmente". Di conseguenza, avremo una scena simile alla Fig. 22.


Riso. 22. La vista finale dopo aver posizionato le luci

7. Posiziona le lanterne nel resto della città. Dove non è molto conveniente utilizzare il posizionamento "automatico" delle luci, fallo manualmente (Fig. 23).


Riso. 23. Luci disposte

Compito 3

Posiziona i piccoli tralicci intorno al parco esattamente allo stesso modo (Fig.).

1. Seleziona il reticolo piccolo e traducilo in Oggetto proxy.

2. Muoviti Punto di rotazione nella base dell'oggetto (Fig. 24).


Riso. 24. Pivot Point alla base dell'oggetto

3. Disegna un percorso per organizzare il reticolo - Cerchio un po' più di prima.

4. Assegnare i controller in sequenza Elenco posizioni e Vincolo di percorso... Attiva il controller Vincolo di percorso premendo il pulsante Imposta attivo... Assegnare il percorso precedentemente creato cliccando sul pulsante Aggiungi percorso... Il reticolo si spostò all'inizio del percorso e rimase perpendicolare ad esso (Fig. 25).


Riso. 25. Reticolo situato perpendicolarmente al percorso

Questo deve essere risolto selezionando la casella accanto a Seguire(Da seguire). È possibile selezionare l'asse desiderato se si desidera specchiare con Flip(Capovolgi) (Fig. 26).


Riso. 26. Reticolo situato lungo il seguente percorso

5. Dal menu principale Utensili scegli uno strumento Istantanea... Nella finestra che si apre, spunta la casella qui a fianco Gamma(Lungo la traiettoria), lascia i valori da 0 a 100, copie(Numero di copie) impostiamo a nostra discrezione, l'importante è che le griglie si adattino perfettamente l'una all'altra. Seleziona il metodo di copia Esempio, premere ok(fig. 27). Le griglie vengono disposte automaticamente lungo il percorso che abbiamo disegnato.


Riso. 27. Utilizzo dello strumento Istantanea

Rimuovere il reticolo animato originale premendo il tasto Eliminare sulla tastiera.

Se un reticolo si trova nel posto sbagliato, ad esempio proprio sulla pista, puoi sempre spostarlo "manualmente" o rimuoverlo completamente. Di conseguenza, avremo una scena simile alla Fig. 28.


Riso. 28. La vista finale dopo aver posizionato piccoli reticoli

Compito 4

Posiziona grandi tralicci intorno alle tue case e a scuola. Da qualche parte dovrai posizionarli manualmente (ad esempio, dove ci sono cancelli), da qualche parte questo processo può essere automatizzato. Di conseguenza, dovrebbe assomigliare a Fig. 29, fig. trenta.


Riso. 29. La vista finale dopo aver posizionato grandi reticoli


Riso. 30. La vista finale dopo aver posizionato grandi reticoli

Compito 5

Disporre le boccole con il metodo automatico lungo i percorsi tracciati (Fig. 31, Fig. 32).


Riso. 31. Cespugli disposti


Riso. 32. Cespugli disposti

5. Posizionamento "automatico" di oggetti utilizzando il plugin MultiScatter - MultiPainter

Abbiamo già considerato diversi modi di posizionare gli oggetti nella scena: "manualmente" e "automaticamente" lungo la traiettoria. Ma cosa succede se abbiamo bisogno di organizzare letteralmente milioni di copie di un oggetto, come erba o foresta? I metodi già familiari a noi non aiuteranno qui.

Probabilmente ne avrai già sentito parlare Multiscatter... Questo è un plugin per 3Ds max, con il quale puoi creare facilmente e facilmente scene con milioni di oggetti. La nuova versione di MultiScatter include un nuovo e utilissimo modulo Multipittore... Ti permette di "dipingere" oggetti su una superficie usando un pennello virtuale. Il disegno può avvenire sia su una superficie, sia su più contemporaneamente. Puoi disegnare con diversi oggetti contemporaneamente. Pertanto, MultiPainter è ideale per i nostri compiti.

1. Scarica e installa il plugin Multiscatter.2. Evidenzia i ciuffi d'erba e traducili Oggetti proxy (tasto destro > esportazione mesh VRay)... Nella finestra di dialogo che si apre, imposta il nome e la cartella, metti un segno di spunta Crea automaticamente proxy... Spingere ok.

3. Verifica che Punto di rotazione era alla base dei ciuffi d'erba.

4. Ora possiamo organizzare questi oggetti usando MultiScatter - MultiPainter... Per fare ciò, nella scheda Creare scegliere Geometria e dall'elenco a discesa selezionare Multiscatter, premi il bottone Multipittore.

Successivamente, assicurati di inserire la sua designazione direttamente nella scena: per fare ciò, tieni premuto il pulsante sinistro del mouse e trascina il cursore in qualsiasi direzione (Fig. 33).


Riso. 33. Notazione MultiPainter

5. Successivamente, vai alla scheda Modificare... Qui vediamo i parametri del nuovo installato Multipittore.

in una pergamena Dipingi oggetti(Disegno di oggetti) sotto Spargi oggetti(Oggetti per posizionamento) è necessario indicare gli oggetti con cui disegneremo. Fare clic sul pulsante + bollitore e seleziona i nostri oggetti nella scena. Pulsante + lista consente di selezionare oggetti da un elenco piuttosto che da una scena. Scegli gli oggetti nel modo che più ti aggrada. Pulsante -bollitore responsabile della rimozione di oggetti per il disegno.

Dopo aver specificato gli oggetti da disegnare, saranno disponibili due parametri: Probabilità(Probabilità, densità) e Tasso di collisione(significato di collisione). Sono loro che dovranno essere configurati. Per ora, impostiamo il valore per il raggio verde Probabilità 200, Tasso di collisione 5, e per un fascio ingiallito Probabilità 10, Tasso di collisione 5.

Nel capitolo Opzioni pennello(Opzioni pennello) possono essere regolate Raggio(Raggio), Morbidezza(Morbidezza dei bordi) e Intensità(intensità, pressione) del pennello. Mettiamo Raggio 100, Morbidezza 1, Intensità 80... Qui si trovano anche i pulsanti più importanti. Colore(Disegna) e Cancellare(Cancellare).

in una pergamena Superfici(Superfici) è necessario specificare la/le superficie/e su cui disegnare. I pulsanti ti sono già familiari, la loro azione è simile ai precedenti. Indichiamo qui la superficie del nostro prato.

in una pergamena Ruotare(Rotazione) è possibile specificare di quanti gradi gli oggetti possono essere ruotati durante il disegno. Mettiamo sull'asse Z valore di rotazione 360 gradi per far apparire diversi e non ripetitivi i ciuffi d'erba.

in una pergamena Scala(Ridimensionamento) è possibile specificare quanto gli oggetti differiranno in scala l'uno dall'altro. Mettiamo il valore A partire dal(A partire dal) 90 , a(Prima) 100 .

in una pergamena Anteprima(Anteprima) è possibile selezionare la modalità di visualizzazione degli oggetti nella finestra. Riquadro - ogni oggetto sarà a forma di parallelepipedo, Croce - a forma di croce, Punti, Conteggio - a forma di insieme di punti, Nessuno - non verrà visualizzato in alcun modo nel viewport, che può essere molto utile in una scena pesante.

Tutte le impostazioni necessarie sono mostrate in Fig. 34.


Riso. 34. Impostazioni MultiPainter

6. Quindi, abbiamo installato tutti i parametri e le impostazioni di cui abbiamo bisogno. Ora selezioniamo entrambe le travi nella sezione Spargi oggetti e premere il pulsante Colore(Disegno). Dipingiamo con un pennello direttamente sul nostro prato (Fig. 35).


Riso. 35. Disegnare con un pennello

Il successo dei parametri impostati per la scena può essere visto solo dopo il rendering preliminare. Diamo un'occhiata al risultato renderizzando un'immagine (Fig. 36). Se necessario, modificare i parametri richiesti.


Riso. 36. Ciuffi d'erba posti in scena

Compito 6

Disponi ciuffi d'erba in tutta la città, usando lo stesso metodo per sistemare gli alberi in città (Fig. 37) e fuori (Fig. 38).


Riso. 37. Erba e alberi in città


Riso. 38. Erba e alberi sparsi fuori città

Nota: per risparmiare risorse del computer, puoi posizionare gli oggetti solo dove volerà la fotocamera.

È interessante!

Non molto tempo fa, ci siamo imbattuti in un articolo interessante sullo sviluppo di giochi per dispositivi mobili utilizzando Unity (datato 12 agosto 2015); tuttavia, il vantaggio principale dell'articolo è che confronta questo strumento con il suo principale concorrente: Unreal Engine.

È con questo straordinario studio che vi invitiamo a incontrarvi venerdì sera. Nei commenti, saremo lieti di leggere raccomandazioni per la pubblicazione di libri sull'UE, e speriamo anche in una fruttuosa discussione.

L'articolo è stato tradotto con piccole abbreviazioni.

Noi (OnlineFussballManager GmbH) stiamo attualmente iniziando lo sviluppo di un nuovo progetto per dispositivi mobili. Creeremo una combinazione unica e avvincente di strategia a turni e gioco manageriale di calcio.

I giocatori saranno in grado di pianificare e creare i propri campi e impianti sportivi del club, allenare la squadra e lavorare sulle sue tattiche. I giocatori di squadra non saranno solo unità in magliette numerate, ma personalità realistiche con le proprie caratteristiche e persino le espressioni facciali. Il tutto si svolgerà in una vista isometrica di varie stanze e aree del club, dove gli edifici animati saranno collocati in una griglia appositamente definita.

Quindi, il momento della verità è arrivato quando abbiamo iniziato a sviluppare la presentazione visiva.
Considerando i requisiti posti davanti a noi e il fatto che dobbiamo sviluppare questo gioco sia per iOS che per Android, come implementare tecnicamente questo progetto?

Una delle prime domande da porre è stata se creare il proprio motore o utilizzarne uno esistente. Ovviamente, la prima opzione è ottimale se vuoi controllare completamente tutto ciò che accade nel tuo codice sorgente, toolchain e anche avere una buona idea di quale sarà il tuo reddito da questo gioco. Lo svantaggio di questo approccio è che un tale sviluppo richiederà un grande sforzo, a causa del quale i termini dell'intero progetto aumenteranno e il prezzo aumenterà in modo significativo. Abbandonammo rapidamente questa idea, poiché volevamo mantenere i costi e le tempistiche del progetto entro limiti ragionevoli.

Certo, puoi fare molte discussioni su quale motore è migliore e per quali scopi. Quante persone - tante opinioni. Devo ammettere che a un certo punto anche noi abbiamo sentito tale soggettività. Il team ha supportato attivamente l'Unreal Engine. Tuttavia, per quanto abbiamo guardato da vicino l'UE, nessuno potrebbe caratterizzarla in modo oggettivo, senza fare appello all'opinione personale.

Quindi, abbiamo deciso di non farci distrarre dai fatti e abbiamo iniziato a esplorare altri strumenti più famosi.
GameMaker è stato presto rifiutato in quanto è più orientato verso i nuovi arrivati ​​che hanno appena iniziato a sviluppare giochi. Quindi è abbastanza facile da imparare, ma le capacità di GameMaker non erano chiaramente all'altezza.

Poi è stata la volta di Cocos2D, che a prima vista sembrava promettente. Come suggerisce il nome, Cocos2D è ottimizzato per lo sviluppo di giochi 2D. Quindi la domanda era se volevamo creare la nostra griglia isometrica di edifici in vero 2D o in 3D reale con un punto di vista fisso. Dopo alcune ricerche aggiuntive, abbiamo optato per un'implementazione 3D. In questo caso, ovviamente, Cocos2D non ci andava bene.

Ci siamo rivolti a Marmalade. Dopotutto, con l'aiuto di Marmalade, giochi famosi come Plants vs. Zombie e Godus. Ma, nonostante abbiamo riscontrato molti vantaggi in questo motore, sono rimasti dei problemi che ci hanno costretto a rivolgerci ad altre opzioni. Uno degli svantaggi più significativi è che la comunità di Marmalade è piuttosto piccola.

Quindi, delle principali alternative, sono rimaste solo Unreal e Unity. Ma anche a questo punto, non potevamo scegliere con sicurezza uno dei due senza assistenza.

Fortunatamente, la conferenza sui giochi della GDC di San Francisco si stava avvicinando, quindi abbiamo colto l'occasione per volare lì e consultarci con i colleghi.

Abbiamo incontrato i ragazzi di Epic, abbiamo conosciuto da vicino Unreal Engine, provato Paper 2D, il loro strumento per visualizzare le anteprime delle applicazioni mobile e abbiamo chiesto cosa potevamo usare: il loro motore o Unity?

I ragazzi ci hanno reso felici, dicendo qualcosa del tipo: "Unreal è bello, ma anche Unity non è male. Provali entrambi."

Quindi siamo andati dagli sviluppatori di Unity e abbiamo dato un'occhiata più da vicino a Unity 5: come migliora le prestazioni su iOS. Alla fine, hanno fatto loro la stessa domanda e hanno ottenuto una risposta simile.

In questa fase, abbiamo deciso per uno studio tecnico approfondito. Abbiamo progettato un prototipo che ricorda da vicino il nostro progetto per testare su diversi dispositivi mobili come andrà il processo di costruzione e quali saranno le prestazioni. Allo stesso tempo, volevamo anche scoprire quali insidie ​​e problemi potrebbero aspettarci durante lo sviluppo del primo e del secondo motore.

Poiché tutti i nostri programmatori erano impegnati nei progetti in corso, abbiamo affidato il lavoro sul prototipo a specialisti della società Bit Baron.

Ricerca motore di Bit Baron

L'Online Fußball Manager (OFM) stava progettando di creare un gioco per cellulare. Ci è stato chiesto aiuto per determinare meglio quale motore è il migliore per il loro progetto. Fino ad allora, eravamo esclusivamente impegnati nello sviluppo di giochi per browser, ma abbiamo deciso che potevamo farcela. È stato suggerito di confrontare due opzioni: Unity e Unreal. Attualmente, queste sono due "locomotive" nel mondo della programmazione di giochi. Ci sono molti rapporti che descrivono in dettaglio le sottili differenze tra i due. Ma la particolarità del nostro lavoro è stata quella di aver scritto per confronto due applicazioni di test quasi identiche e caratterizzato le loro prestazioni secondo il sistema dei punti di controllo (benchmarking).

Scrivendo due applicazioni simili, siamo stati in grado di testarle entrambe su un piano di gioco piatto, dire a OFM quale versione funzionava meglio ed evidenziare ulteriori problemi.

Caso di prova

Volevamo creare un benchmark che fornisse a OFM informazioni direttamente correlate al tipo di gioco che stanno creando. I clienti hanno indicato che il prototipo dovrebbe avere diversi edifici e alberi animati. Pertanto, abbiamo creato una scena 3D in cui all'utente è stato chiesto di disporre in modo indipendente questi oggetti sulla mappa. La griglia era 11x16 e ospitava fino a 176 edifici. Ogni quadrato della griglia supportava fino a 6 alberi, quindi potevano esserci più di 1000 alberi in una scena. Abbiamo aggiunto una semplice interfaccia utente in cui è possibile aggiungere un numero specificato di alberi ed edifici alla scena. Abbiamo anche aggiunto la funzione di aggiungere edifici in luoghi specifici: per questo dovevi fare clic sulla mappa nel punto desiderato. Per quanto riguarda l'organizzazione del programma, abbiamo costruito una griglia su un piano e visto la scena attraverso una telecamera posta "sopra la testa dell'utente". Abbiamo anche aggiunto la funzionalità della fotocamera dedicata per consentire all'utente di ingrandire e fare una panoramica della scena. Poiché questo prototipo è stato creato per determinare il motore per lo sviluppo, abbiamo fatto del nostro meglio per rendere la scena quasi la stessa in entrambe le versioni. Altrimenti, sarebbe impossibile confrontare la qualità visiva della prima e della seconda opzione. Ho dovuto armeggiare con esso, poiché alcune cose vengono gestite in modo diverso in Unreal e Unity. Abbiamo finito con due scene molto simili.

Per unificare i test delle prestazioni, abbiamo voluto applicare modelli identici di alberi e edifici a entrambi i sistemi. Per gli alberi, è stato utilizzato un modello SpeedTree mobile, che includeva solo circa 1000 poligoni e ha permesso di stimare bene come piccoli incrementi nei triangoli visualizzati influiscano sulla frequenza dei fotogrammi. Per gli edifici animati, non siamo riusciti a trovare un modello che funzionasse con entrambi i motori, quindi abbiamo utilizzato due modelli diversi. Entrambi erano dimensionati per poco più di 16.000 poligoni ciascuno e avevano impostazioni del materiale quasi identiche. Abbiamo disattivato completamente i livelli di dettaglio (LOD) in modo che in entrambe le opzioni venga visualizzato lo stesso numero di triangoli a qualsiasi distanza dalla fotocamera. Il benchmark è stato progettato non solo per riflettere le differenze di prestazioni tra i due motori, ma anche per mostrare la differenza nella qualità del rendering. Ho anche dovuto tenere d'occhio gli shader standard di Unreal Engine. Notando che Unreal aveva un aspetto chiaramente migliore, abbiamo scoperto che c'erano un certo numero di shader nella fotocamera che erano costosi in termini di prestazioni. Dopo averli spenti, la scena visivamente è rimasta quasi invariata. L'illuminazione era un problema molto diverso, quindi ci è voluto un po' di tempo per farlo bene.

I clienti erano interessati non solo ai test di rendering, ma anche a come sarebbero state le impressioni di sviluppo sul primo e sul secondo motore. Dopotutto, qual è il punto delle prestazioni se non hai tempo per scrivere il gioco in tempo. Per acquisire queste impressioni, abbiamo confrontato fattori come il tempo di compilazione, la documentazione disponibile, la complessità della distribuzione in un ambiente mobile e la complessità dell'iterazione del codice. Credevamo che fosse proprio su questi indicatori che Unity sarebbe stato più forte (come fiore all'occhiello nel campo dello sviluppo di giochi per dispositivi mobili).

Progetto di unità

Prototipo nell'Unità. Ci sono 200 alberi sulla mappa

Buono

  • Gli elementi principali di Unity sono gli oggetti ("GameObject") e i componenti ("MonoBehaviour"). Una volta che hai imparato questo concetto, puoi già lavorare con Unity. Se utilizzato correttamente, questo sistema può migliorare notevolmente l'organizzazione di un progetto.
  • Unity include molti componenti che ti forniscono tutto il necessario per creare un gioco, a parte la logica del gioco stessa. Come detto sopra, un componente può essere piccolo quanto il Piano (non disponibile in Unreal), che abbiamo usato per generare la mesh. Le ultime aggiunte al motore sono i componenti "UI" e "Layout", che forniscono interfacce utente grafiche potenti e scalabili.
  • L'editor può essere esteso con i tuoi script, inoltre, l'Asset Store ha tonnellate di risorse per tutte le occasioni. L'Asset Store contiene anche molti script utili, modelli di materiali e altro ancora, che saranno particolarmente utili per la prototipazione: puoi semplicemente caricare tutto ciò di cui hai bisogno come risorse temporanee e utilizzarlo come un pratico modello di simulazione.
  • Unity è stato uno dei primi motori open source a supportare lo sviluppo mobile. Pertanto, è molto conveniente quando si distribuisce in un ambiente mobile, sembra e agisce lì più o meno allo stesso modo dell'editor. Il sistema viene costantemente migliorato e l'implementazione procede senza intoppi. Questo è stato un fattore significativo nella nostra decisione di realizzare un prototipo mobile.
  • Unity è probabilmente la più grande community di qualsiasi motore di gioco, quindi se hai una domanda, è probabile che ci sia una risposta. Sebbene Unity supporti molti linguaggi di scripting, la documentazione per ciascuno è molto solida. Inoltre, anche se trovi una risposta riguardante un'altra lingua, la logica di questa risposta ti sarà comunque chiara e potrai adattarla per risolvere il tuo problema.
  • Unity ha svolto un'enorme quantità di lavoro per ottimizzare il rendering per molti oggetti dello stesso tipo. Per ottenere prestazioni comparabili in Unreal, dovresti usare Instanced Rendering e questo meccanismo è solitamente meno flessibile del rendering in Unity.

Male

  • Il motore è closed source. Se stai parlando con Unity del prezzo del codice sorgente, allora devi conviverci. Pertanto, sono possibili problemi se l'una o l'altra funzionalità su cui fai affidamento fallisce: dovrai attendere l'aggiornamento.
  • Il nuovo sistema di interfaccia utente è abbastanza buono. Manca un editor speciale, tutte le modifiche vengono apportate direttamente nella scena e la scena è molto grande. Quando apri una scena e vuoi modificare l'interfaccia utente, devi prima ingrandire l'area di interesse praticamente.

Questa è un'immagine dell'editor di Unity. Siamo molto fortunati di essere stati in grado di integrarlo con i nostri script.

Orribile

  • Ci sono due problemi con il nuovo sistema di interfaccia utente in Unity. Quando si preme il dito sul touchscreen, non sarà possibile determinare se è stato premuto un determinato elemento grafico. Supponiamo che l'utente voglia eseguire una panoramica dello schermo utilizzando un dispositivo di scorrimento. Ma se ereditiamo dalla classe GraphicsRaycaster, possiamo aprire tutti i dati desiderati che possono essere resi pubblici. Se sostituisci GraphicsRaycaster nell'oggetto canvas, puoi verificare se è stato fatto clic sull'elemento dell'interfaccia utente.
  • Il secondo problema con l'interfaccia utente di Unity ha a che fare con il ridimensionamento a diverse dimensioni del display. Fondamentalmente l'oggetto canvas ha opzioni di ridimensionamento con alcuni parametri. Ma organizzare la loro anteprima è stato molto difficile, abbiamo dovuto distribuire l'applicazione sul dispositivo più volte fino a quando non abbiamo trovato una configurazione normale.
  • Inoltre, eravamo molto confusi dal pannello delle statistiche di Unity. Dopo aver implementato un contatore di frame rate in-game, abbiamo confrontato il suo valore con quanto visualizzato nel pannello delle statistiche dell'editor di Unity. Questi valori erano diversi. Dopo aver cercato su Internet altre opzioni di implementazione, abbiamo trovato la risposta: il pannello statistico fornisce una stima di quanti frame il gioco salterebbe se funzionasse in modo autonomo e non nell'editor. Pertanto, la logica del nostro contafotogrammi era perfettamente corretta.

I valori di frame rate sono 37 contro 32. Nel pannello delle statistiche di Unity, vediamo le stime per l'applicazione stand-alone, che non corrispondono a quelle reali

Progetto irreale

Ecco come appare il progetto nell'editor Unreal. Ci sono molti editor nidificati specializzati qui, alcuni dei quali sono paragonabili per funzionalità a interi programmi.

In UE, è stata scattata la stessa schermata di Unity (vedi sopra), con le impostazioni mobili lasciate di default, senza illuminare gli alberi

Quando le impostazioni sono state regolate, gli alberi sono risultati migliori, ma ancora non buoni come in Unity.

Buono

  • La versione di prova di Unreal è completamente gratuita. Qui ottieni un editor completamente funzionale. Unity ha anche una versione gratuita, ma passare a Pro ti costerà un bel soldo.
  • Unreal ha un potente editor che contiene diversi editor altamente specializzati. Se hai familiarità con questi editor "nidificati", ti saranno di grande aiuto nello sviluppo e spesso forniranno informazioni che non vedrai in Unity. Esistono editor che possono anche sostituire completamente alcuni programmi. L'interazione di tutti questi sottosistemi è un capolavoro.
  • Il motore viene fornito con tutto il codice sorgente. Pertanto, puoi approfondire e capire come funzionano le singole parti. Inoltre, puoi anche correggere bug nel motore o integrarne tu stesso le funzionalità.
  • La visualizzazione nell'editor è fantastica. È solo che gli occhi corrono dall'abbondanza di opzioni di rendering (relative, ad esempio, all'illuminazione o alla complessità degli shader). Qui troverai tonnellate di shader all'avanguardia forniti anche con il motore. Fondamentalmente, Unreal offre il miglior motore di rendering sul mercato. Puoi creare scene incredibilmente belle.
  • I progetti sono utili per creare rapidamente qualcosa di semplice e implementare la logica di gioco di base. Si integrano perfettamente con C ++ e questa decisione è stata presa per un motivo: non solo apre enormi opportunità sia per i principianti che per gli sviluppatori esperti, ma consente anche loro di interagire tra loro.
  • L'integrazione complessiva con C++ è ottima. Così come un riavvio a caldo.

I disegni sono eccellenti per compiti semplici e la loro integrazione con C++ è fantastica. Ma se è coinvolta una logica più complessa, diventano rapidamente ingombranti e difficili da affrontare.

Male

  • È difficile prendere il ritmo durante lo sviluppo con l'Unreal Engine. Anche se conosci bene il C++, ci vorrà molto tempo per imparare le varie macro e funzioni di UE4. Questo può essere molto difficile per chi sta imparando C++ allo stesso tempo.
  • I disegni possono confondersi molto rapidamente. Quando la logica include dozzine di nodi, ognuno dei quali contiene un progetto, a volte può essere semplificata in un paio di righe di codice scritte in semplice C++. Di solito questo non è un problema, poiché è del tutto possibile lavorare con C ++, ma con alcune cose, ad esempio "UMG" (sistema UI), è necessario utilizzare i disegni, quindi può essere fonte di confusione.
  • Il simulatore mobile si è rivelato molto incoerente. Ha fornito avvisi quando abbiamo provato a utilizzare le funzioni dello shader che non vengono utilizzate nell'ambiente mobile, ma anche se lo shader ha superato la convalida, potrebbe non funzionare. Fondamentalmente, questo simulatore è una buona cosa, ma le sue qualità visive lasciano molto a desiderare.
  • Sebbene Unreal abbia una vasta comunità di sviluppatori, raramente abbiamo ricevuto risposta alle domande. Inoltre, quasi tutto il supporto che abbiamo ricevuto era nei progetti. Unreal Engine 4 sta espandendo attivamente la community, sta già andando bene, sembra che gli specialisti siano desiderosi di sviluppare e aiutare. Ma la comunità di Unity è ancora migliore.

Orribile

  • La documentazione C++ è gravemente carente. Il materiale di riferimento online per le classi C++ è scomodo. Inoltre, a causa degli aggiornamenti costanti, molte funzionalità diventano rapidamente obsolete. Fai attenzione mentre guardi i video di aiuto, poiché potrebbero descrivere una versione obsoleta del motore e funzioni non più utilizzate.
  • Lavorando con la GUI, abbiamo utilizzato l'innovativo sistema "UMG". Si basa su progetti e può essere molto utile. Con un po' di lavoro siamo riusciti ad ereditare la classe C++ ea ripulire un po' l'ordine con i disegni. Tuttavia, il sistema è ancora grezzo, privo di alcuni controlli come i pulsanti di attivazione/disattivazione. Inoltre, non esiste praticamente alcuna documentazione C ++ corrispondente. L'editor è caduto diverse volte mentre stavamo sviluppando l'interfaccia utente. I fallimenti imprevisti possono costare ore di lavoro e sono piuttosto snervanti. Lo sviluppo di questo sistema continua, ma finora è tutt'altro che perfetto.
  • Lo sviluppo mobile con Unreal è lento. Il programma impiega molto tempo per essere distribuito sul dispositivo. Android aveva alcuni problemi visivi come contorni sfocati e alberi non illuminati. Su iOS i problemi erano molto più seri. UE4 supporta la creazione per un dispositivo iOS solo se l'applicazione è costituita solo da progetti. Questa è colpa di Apple, ma abbiamo importato fino in fondo le chiavi di sviluppo (puoi immaginare) prima di imbatterci in questo problema. In iOS, le trame degli alberi costruite sulla base di SpeedTree non venivano visualizzate, gli alberi erano grigi e spogli, senza foglie. Quindi, il supporto di Unity per lo sviluppo mobile è un enorme miglioramento rispetto a Unreal.

Risultati dell'analisi comparativa. Frequenza dei fotogrammi

Sorprendentemente, durante il test del frame rate (FPS) su dispositivi diversi, abbiamo ottenuto risultati molto diversi. Su alcuni dispositivi, Unity vince con qualsiasi configurazione. In altri casi, Unreal ha battuto Unity in test in cui c'erano molti edifici. In linea di principio, Unreal ha vinto, ma a caro prezzo. La qualità e la consistenza dell'immagine erano significativamente migliori in Unity. Le trame irreali su alcuni dispositivi sembravano sfocate, gli alberi si sono rivelati molto peggiori. La differenza di qualità era in parte dovuta a ciò che viene visualizzato da un lato nell'editor Unreal e nell'anteprima mobile e dall'altro su un vero telefono cellulare. Questo problema era particolarmente evidente quando si trattava di illuminazione scenica. È stato molto difficile scegliere le impostazioni in modo da regolare correttamente la luce, l'intera impostazione sui dispositivi mobili spesso sembrava oscurata. A questo proposito, Unity è stato molto più coerente, l'immagine su qualsiasi smartphone era la stessa dell'anteprima nell'editor.

I risultati per entrambi i motori si sono rivelati molto migliori di quanto ci aspettassimo (come ricorderete, nei nostri modelli di test c'erano circa 10 volte più triangoli rispetto ai normali giochi per cellulari).

Su iOS, entrambi i motori hanno reso i modelli animati con un successo approssimativamente uguale. Tuttavia, i test con gli alberi su questo dispositivo non hanno avuto successo, poiché Unreal non ha mostrato alcuna trama sui modelli ad albero. Abbiamo cercato di trovare la causa di questo pattern, ma non siamo riusciti a risolverlo. Inoltre, va notato che durante la distribuzione utilizzando questi motori, dovresti avere un computer Apple a portata di mano. Questo è molto scomodo, ma la stessa Apple è responsabile di questa situazione. I clienti ci hanno anche chiesto di eseguire il benchmark su Windows Phone. Sfortunatamente, Unreal non supporta ancora le distribuzioni su Windows Phone, quindi Unity ha vinto qui per definizione. Poiché Windows Phone ha ancora una quota di mercato molto ridotta, lo sviluppo di Unreal in questa direzione non è considerato una priorità.

In definitiva, i test di benchmark hanno mostrato solo che i due motori erano quasi uguali in termini di potenza. Pertanto, è particolarmente importante prestare attenzione ai vantaggi e agli svantaggi specifici di ciascuno di essi. Alla fine, se le prestazioni sono così vicine, allora la convenienza e la velocità di sviluppo per ciascuno di questi motori vengono alla ribalta.

Altri parametri di controllo

Ecco alcuni risultati più interessanti che siamo riusciti a scoprire durante i nostri test:

  • Entrambi i motori difficilmente differivano nel consumo di memoria. Sui dispositivi Android, Unity ha superato, su dispositivi iOS, Unreal.
  • Il progetto Unity è significativamente più piccolo (Android: 42 MB / iOS: 100 MB) rispetto al progetto Unreal (Android: 101 MB / iOS: 173 MB).
  • Unity è circa tre volte più veloce da distribuire su un dispositivo. Inoltre, Unity compila il codice molto più velocemente.
  • Unreal ha consumato la batteria in modo molto più economico. Dopo due ore di lavoro con 150 modelli animati sullo schermo, Unreal è riuscito a scaricare la batteria di Android del 42 percento e di iOS del 36 percento. Unity ha consumato circa il 72% su Android e il 47% su iOS con la stessa configurazione e runtime.

conclusioni

Sulla base dei risultati della ricerca, ci è piaciuto molto su entrambi i motori. Inoltre, abbiamo trovato molte aree in cui questi strumenti possono essere migliorati per rendere il programmatore più a suo agio con cui lavorare. Nessuno dei due motori ha avuto un vantaggio significativo rispetto all'altro, data la rapidità con cui le loro capacità e il supporto sono cambiati. I test di rendering hanno dimostrato che entrambi i prodotti spremere il massimo dal dispositivo e, in linea di principio, sono abbastanza comparabili. Ancora una volta, è qui che l'usabilità e l'intuizione del design vengono alla ribalta. Considerando tutto ciò che abbiamo imparato su questi motori e quali problemi abbiamo dovuto affrontare durante lo sviluppo, abbiamo dovuto affrontare una scelta difficile, ma alla fine abbiamo optato per Unity.

Nonostante inizialmente scommettessimo sulla vittoria di Unreal Engine, attualmente Unity è ancora un'opzione più vincente, almeno quando si tratta di sviluppo di giochi per dispositivi mobili.

Ecco i motivi principali della nostra decisione:

  • Unity è visivamente più coerente su tutti i dispositivi e si distribuisce rapidamente con un clic su qualsiasi piattaforma.
  • Unity occupa molto meno spazio sul dispositivo e ha un impatto minore sull'esperienza dell'utente finale. Le dimensioni compatte sono particolarmente importanti nel Google Play Store, dove l'APK deve essere suddiviso se il file è più grande di 50 MB.
  • L'unità è molto più facile da imparare e da capire. Armati di Unity, gli utenti inesperti possono essere operativi più velocemente e creare prodotti supportati da una vasta comunità di esperti.
  • Il tempo di iterazione in Unity è molto più breve (la distribuzione e la compilazione del codice sorgente sono più veloci, gli shader vengono compilati quasi istantaneamente)

Ci teniamo a sottolineare che i nostri risultati devono essere considerati nel contesto del prototipo realizzato. Ciò che funziona per un'azienda non funziona per un'altra. Inoltre, ci sono molti altri motori di gioco, alcuni dei quali potrebbero essere più adatti al tuo compito specifico. In alcune aziende con tempo e risorse sufficienti, potrebbe anche essere più opportuno scrivere il proprio motore. Non esiste una soluzione valida per tutti nello sviluppo di giochi. Fatti un favore e sperimenta bene. Inoltre, molti di loro diventano più economici o addirittura shareware come Unreal. Non saremmo sorpresi se Unity seguisse anche l'esempio di Unreal e liberalizzasse il suo modello di prezzo.

Conclusione

È interessante notare che i ragazzi di Bit Barons ci hanno consigliato di prendere Unreal Engine per il nostro progetto prima della prototipazione. Considerando che anche noi di OFM inizialmente abbiamo preferito Unreal Engine, forse la soluzione finale si è rivelata subottimale.

Certo, non è facile progettare, scrivere e testare un prototipo, soprattutto se devi solo decidere il motore del progetto. Ma la questione di una tale scelta è di fondamentale importanza.

Infine, abbiamo preso in considerazione alcuni altri fattori che potrebbero cambiare la nostra opinione. Vale a dire: quanto è facile oggi trovare talenti esperti per ogni motore e quali sono i modelli di business a tua disposizione?

Sulla questione del personale, ci siamo consultati con reclutatori esperti per scoprire numeri più o meno reali. Attualmente ci sono circa quattro Unity Professional per ogni Unreal Specialist. Per quanto riguarda il modello di business, Unreal non prevede un forfait iniziale, ma richiede costi di licenza. In Unity, è vero il contrario. Entrambi questi fattori erano importanti per noi e, di conseguenza, abbiamo deciso di optare per Unity.

Quindi, costruire una base nella strategia. I parametri coinvolti in questo processo possono essere molto diversi. Forse oro o minerali, disponibilità di energia e così via. Ogni progetto può avere qualcosa di individuale, tuttavia, comune a tutti è la costruzione stessa, cioè la disposizione degli oggetti in una determinata area. Cosa dobbiamo fare? Innanzitutto, abbiamo un set di icone, ognuna delle quali rappresenta un edificio. Quando fai clic sull'icona, otteniamo un edificio vuoto, che può essere spostato lungo il piano XZ. In secondo luogo, è necessario assicurarsi che non si possano creare nuovi edifici dove esiste già un edificio e dove è vietato costruire qualsiasi cosa.


Questa opzione è adatta solo per il 3D; per un progetto bidimensionale, è necessario rifare il raycast e il piano di movimento degli oggetti.

Formazione. Creazione degli edifici stessi, modelli di costruzione. Come saranno animati e così via non è importante, il modello principale dovrebbe essere sotto il collisore, questo è necessario non solo per la costruzione, ma anche per creare una mappa di navigazione dei robot. Ad esempio:

Il collisore deve coprire l'intero oggetto.

Dopo aver creato la struttura principale, ne facciamo una copia e sostituiamo il materiale. Cioè, il compito è creare un'anteprima dell'edificio futuro. In qualsiasi strategia, prima trasciniamo e rilasciamo il layout degli edifici, di solito rendendoli semitrasparenti. Poiché questo è un layout, su di esso rimuoviamo l'animazione se presente e selezioniamo l'aspetto, ad esempio:


Allo stesso modo, l'oggetto deve essere chiuso dal collisore, ma nella modalità è il grilletto?... In questo caso, il layout di collisione può essere reso leggermente più grande dell'originale, ad esempio +0.1, questo aumenterà la sensibilità e assicurerà che sia impossibile creare un oggetto sopra l'altro. Tutti i layout devono avere installato il layer Ignore Raycast! Inoltre, appendiamo al modello Corpo rigido e spegni la gravità. Inoltre, appendiamo un piccolo script MaskControl:

Utilizzo di UnityEngine; utilizzando System.Collections; public class MaskControl: MonoBehaviour ( public string respawnTag = "Respawn"; void Start () (DragAndDrop.isOn = true;) void OnTriggerStay (Collider coll) (if (coll.tag! = respawnTag) (DragAndDrop.isOn = false;) ) void OnTriggerExit (Collider coll) (if (coll.tag! = respawnTag) (DragAndDrop.isOn = true;)))
Lo scopo di questo script è determinare dove l'oggetto può essere installato e dove no. In una variabile respawnTag specifichiamo un tag che consente l'installazione. Ad esempio, se crei un aereo con un tag, un edificio può essere costruito solo in quest'area e se un oggetto si imbatte in altri edifici, verrà automaticamente bloccato. In generale, tutto è uguale a una strategia convenzionale.

Successivamente, i nomi degli edifici. I prefabbricati dell'edificio originale sono chiamati così ID_xxx, ovvero - numero, trattino basso, nome. Prefabbricati di layout, denominati esattamente gli stessi, numeri originale e layout - devono corrispondere e i nomi possono variare.

Ora appendiamo lo script a un oggetto vuoto Trascinare e rilasciare:

Utilizzo di UnityEngine; utilizzando System.Collections; utilizzando il sistema; public class DragAndDrop: MonoBehaviour (public Transform original; public Transform mask; public float shift = 0.01f; public string respawnTag = "Respawn"; public static bool isOn; private Transform original_tmp; private Transform mask_tmp; private Vector3 curPos; void Start () (isOn = false;) public void SetMask (int id) (foreach (Transform obj in original) (string name = obj.name.Split (nuovo carattere ("_"), StringSplitOptions.RemoveEmptyEntries); if (id.ToString ( ) == name) (original_tmp = Instantiate (obj); original_tmp.gameObject.SetActive (false);)) foreach (Transform obj in mask) (string name = obj.name.Split (nuovo carattere ("_"), StringSplitOptions .RemoveEmptyEntries); if (id.ToString () == name) (mask_tmp = Instantiate (obj);))) void Update () (RaycastHit hit; Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition); if ( Physics.Raycast (ray, out hit)) (curPos = hit.point + hit.normal * shift;) if (mask_tmp) (mask_tmp.position = curPos; if (Input.GetAxis ("Mouse ScrollWheel")> 0) (mask_tmp.localEulerAngles + = new Vector3 (0, 45, 0); ) if (Input.GetAxis ("Rotella di scorrimento del mouse")< 0) { mask_tmp.localEulerAngles -= new Vector3(0, 45, 0); } if(Input.GetMouseButtonDown(0) && isOn) { original_tmp.gameObject.SetActive(true); original_tmp.position = mask_tmp.position; original_tmp.localEulerAngles = mask_tmp.localEulerAngles; original_tmp = null; isOn = false; Destroy(mask_tmp.gameObject); } else if(Input.GetMouseButtonDown(1)) { Destroy(original_tmp.gameObject); Destroy(mask_tmp.gameObject); } } } }
originale- una serie di tutti i prefabbricati con modelli di costruzione originali.

maschera- una serie di tutti i prefabbricati di layout.

cambio- spostamento lungo l'asse per il modello.

respawnTag- etichetta dell'aereo su cui è consentita la costruzione.

Devi aggiungerne alcuni alla scena. interfaccia utente elementi, più precisamente icone, GameObject> UI> Image. Creiamo il numero richiesto di icone e le posizioniamo secondo necessità. Quindi, per ogni icona è necessario aggiungere un componente Attivatore di eventi, seleziona la funzione Clic del puntatore e quindi trascina l'oggetto script DragAndDrop nel campo attivo e seleziona la funzione script dal menu - SetMask e indicare il numero del layout. Ad esempio:


Cioè, il punto è che ogni icona corrisponde a un modello specifico, quindi assegniamo dei numeri. Nel gioco, fai clic sull'icona - invia il numero allo script - trova il modello corrispondente. È così che funziona.

LMB sull'icona: ottieni un layout dell'edificio. LMB ripetuto: installa l'edificio. RMB - annulla. Rotellina del mouse - ruota.

Principali articoli correlati