Cum se configurează smartphone-uri și PC-uri. Portal informativ
  • Acasă
  • Fier
  • Unreal vs Unity: care este mai bun pentru dezvoltarea jocurilor mobile? Rezultate de referință. rata de cadre

Unreal vs Unity: care este mai bun pentru dezvoltarea jocurilor mobile? Rezultate de referință. rata de cadre

În lecțiile anterioare, am modelat și texturat peisajul, clădirile și elementele exterioare. Cum să combini acum toate aceste obiecte într-o singură scenă și să le plasezi în locurile potrivite? Unde găsiți obiectele dispărute - mașini, copaci, tufișuri, flori? Vom afla despre asta în această lecție.

În acest tutorial, vom insera obiecte în scenă folosind comanda Combina(Combină) și aranjează aceste obiecte ca controlere Lista de poziții(controler de poziție listă), Constrângere de cale(Restricție pe parcurs), instrument instantaneu(tip obiect), plugin Multidifuzieși modulul acestuia MultiPainter, precum și să învețe cum să traduci obiecte în Obiecte proxy.

1. Inserarea obiectelor din alte fișiere.

1. Deschideți fișierul peisaj. În acest fișier vom insera toate celelalte obiecte și le vom plasa pe peisajul desenat.

2. Introduceți clădiri. Pentru a face acest lucru, accesați meniul fişier(Fișier) > faceți clic pe săgeata de lângă buton Import(Import) > Combina(Combină) (Fig. 1).

Orez. 1. Folosind comanda Merge

3. În fereastra care se deschide, selectați fișierul dorit și faceți clic deschis(Deschis) (Fig. 2).


Orez. 2. Selectarea fișierului dorit

4. A apărut o fereastră Combina(Merge), care listează numele tuturor obiectelor din fișierul atașat. Avem nevoie doar de clădiri. Pentru a selecta doar obiectele de care avem nevoie, faceți clic pe ele în timp ce țineți apăsată tasta ctrl. Clic O.K(Fig. 3).


Orez. 3. Selectarea obiectelor necesare

Obiectele selectate sunt introduse în scena peisajului (Fig. 4).


Orez. 4. Inserarea obiectelor

Exercitiul 1

Introduceți singuri toate elementele exterioare în același fișier (Fig. 5).


Orez. 5. Introducerea obiectelor exterioare

Notă: dacă ați plasat toate obiectele pe straturile dvs., atunci când lipiți aceste obiecte într-un alt fișier, straturile vor fi și ele copiate. Prin urmare, dacă ați creat cu conștiință straturi așa cum este descris în lecții, acum ați făcut-o Gestionați straturi Straturile (Layer Manager) ar trebui să fie prezente ca în Fig. 6.


Orez. 6. Vedere a managerului de straturi

2. Inserarea obiectelor din biblioteci de modele gata făcute

În lecțiile anterioare, am învățat cum să modelăm multe dintre obiectele de care avem nevoie. Dar există astfel de obiecte, a căror modelare va dura foarte mult timp, fie este nevoie de cunoștințe foarte profunde ale programului pentru a le crea, fie pur și simplu nu are rost să le modeleze, deoarece ele există deja și pot fi pur și simplu descărcate. Astfel de obiecte includ mașini, copaci, tufișuri, flori etc.

Există multe site-uri de unde puteți descărca modele similare, de exemplu:

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

De asemenea, unele modele gata făcute pot fi descărcate din secțiunea „Bibliotecă” a acestui site.

Asemenea biblioteci de modele gata făcute îi ispitesc pe randerii începători să asambleze o scenă rapid și ușor, inserând în ea toate modelele mai mult sau mai puțin potrivite din colecție. Dar fiți foarte atenți, deoarece poate exista o problemă de lipsă de resurse hardware în etapa finală a lucrării. Acest lucru se datorează faptului că modelele descărcate pot avea un număr mare de poligoane.

    În primul rând, atunci când căutați modele, asigurați-vă că materialele modelului se potrivesc cu redarea în care lucrați (VRay).

    În al doilea rând, după descărcare, nu introduceți imediat modelul în scena dvs., ci deschideți-l într-o scenă separată și eliminați modelul de tot ceea ce este de prisos care nu va fi vizibil clar. Unele elemente au în general sens să fie eliminate sau remodelate, deoarece modelatorilor rareori le pasă să minimizeze produsul lor.

Abia după aceea puteți introduce în siguranță modelul în scena dvs., fără teama de a-l supraîncărca.

Sarcina 2

Descărcați, verificați și lipiți ( import > îmbinare) în scena noastră de modele de copaci, tufișuri, flori, pietre, mașini și mai departe, la discreția dvs. (Fig. 7).


Orez. 7. Introducerea modelelor finite

Asigurați-vă că creați straturi pentru aceste obiecte și plasați-le fiecare pe propriul strat (Fig. 8).


Orez. 8. Vedere a managerului de straturi

3. Dispunerea „manuală” a obiectelor

Pentru o reglare mai precisă și mai fină a scenei, este foarte convenabil să folosiți metoda manuală de aranjare a obiectelor. Prin urmare, vom amenaja clădiri, bănci, urne, indicatoare rutiere, flori și pietre pentru paturi de flori, mașini în cel mai obișnuit mod - „manual”, pur și simplu trăgându-le cu mouse-ul folosind instrumentul Selectează și Mută(Selectați și mutați). Obiectele lipsă vor fi obținute prin copiere cu tasta apăsată Schimb. Selectați tipul de copiere Instanță(Eșantion) (Fig. 9).


Orez. 9. Copierea obiectelor lipsă

Ca rezultat, ar trebui să obținem o scenă ca în Fig. 10, Fig. unsprezece.


Orez. 10. Vedere a scenei după aranjarea „manuală” a obiectelor


Orez. 11. Obiecte aranjate

4. Plasarea „automată” a obiectelor folosind controlere, transfer în Proxy și instrumentul Snapshot

Există obiecte care trebuie aranjate cu o oarecare regularitate, de exemplu, felinare, zăbrele, tufișuri în modele frumos „tăiate”. Prin urmare, vom lua în considerare o metodă care vă permite să automatizați procesul de plasare a obiectelor.

1. Selectați un obiect, de exemplu, un felinar.

2. Să traducem felinarul în Obiect proxy. Obiectul proxy devine, parcă, o referință la un obiect care este situat în altă parte. Acest lucru va ajuta la reducerea încărcăturii grele a programului și a plăcii video și va reduce necesarul de alocare a memoriei RAM. Acest lucru va face posibilă utilizarea a milioane și chiar miliarde de poligoane în scenă pe computere obișnuite, care este cel mai potrivit pentru rezolvarea sarcinii noastre de a crea un oraș.

Să formulăm condițiile necesare pentru transferul unui obiect la Obiect proxy.

    Dacă obiectul constă din mai multe componente, atunci acestea trebuie combinate folosind comanda Atașațiîntr-un singur obiect.

    Toate texturile ar trebui să fie deja aplicate obiectului.

Numai după îndeplinirea acestor condiții, obiectul poate fi transferat proxy. Pentru a face acest lucru, faceți clic dreapta pe obiect și selectați comanda din meniul contextual care se deschide. Export de plasă V-Ray(Export pe suprafața V-Ray) (Fig. 12).


Orez. 12. Transferarea unui obiect către Proxy

În fereastra care se deschide, în câmp Pliant(Folder) Specificați calea pentru salvarea obiectului Proxy (este recomandabil să creați un folder pentru obiectele Proxy în folderul proiectului, astfel încât obiectele Proxy să nu se piardă atunci când lucrați la proiectul dvs. pe alt computer). În câmp fişier(Fișier) Specificați un nume pentru obiectul Proxy sau lăsați valoarea implicită. Asigurați-vă că bifați caseta Creați automat proxy(Creați automat proxy) și faceți clic O.K(Fig. 13).


Orez. 13. Parametri pentru transferul unui obiect către un proxy

Obiectul își va schimba aspectul. Aceasta este o altă caracteristică a obiectelor Proxy pentru a ușura încărcarea. Obiectul poate arăta ca o casetă, ca o grilă neclară, sau chiar ca un punct etc. - în funcție de opțiunile de vizualizare selectate în parametrii obiectului Proxy - dar după randare va lua forma reală (Fig. 14).


Orez. 14. Afișarea simplificată a obiectului și vizualizarea acestuia

3. Verificați dacă aveți punct de pivot(Punctul de ancorare, punctul de pivot și scara obiectului) la baza obiectului. Acum, implicit, punctul se află în mijlocul felinarului. Trebuie mutat la baza sa. Pentru a face acest lucru, accesați fila Ierarhie(Ierarhie) și selectați Afectează numai pivotul(Influență asupra punctului de referință). Acum cu ajutorul Selectează și Mută(Selectați și mutați) și Snaps 3 putem muta punctul de ancorare (Fig. 15). După aceea, nu uitați să părăsiți modul de editare.


Orez. 15. Mutați punctul de pivot

4. Să creăm în avans o cale, de-a lungul căreia luminile vor fi așezate uniform. În cazul nostru, pur și simplu creăm Cercîn jurul parcului, ca în Fig. 16.


Orez. 16. Crearea unei căi

5. Atribuiți un felinar controlorii. Acest concept se referă la animație în 3Ds Max. Cu ajutorul controlerelor, un dezvoltator de grafică 3D poate controla flexibil modificarea parametrului animat al obiectelor. Controlerele de animație sunt cioturi de dependențe, în funcție de care parametrii pot fi modificați. În acest tutorial, vom folosi controlere nu pentru animație, ci pentru plasarea obiectelor.

Selectați lanterna și accesați fila Mişcare(Trafic). Să deschidem scroll Atribuiți controler(Atribuiți controler), evidențiați pe linie Poziție: Poziția XYZ(Poziție: poziție XYZ) și faceți clic pe butonul de atribuire a controlerului. Din lista care se deschide, selectați Lista de poziții(controler de poziție Listă). Acest controler vă permite să combinați mai multe controlere independente simultan pentru a crea o animație comună, acest lucru ne va fi util în viitor.


Orez. 17. Scopul controlerului listei de poziții

După aplicarea acestui controler în liste Poziție: Listă de poziții > Poziție XYZ: Poziție XYZ va apărea linia Disponibil(Disponibil) care vă permite să adăugați controlere noi la listă. Selectați această linie și faceți clic din nou pe butonul. Atribuiți controler. În caseta de dialog care se deschide, de data aceasta alegeți Constrângere de cale(Restricție pe parcurs). Acest controler restricționează mișcarea obiectului de-a lungul căii, care este spline-ul specificat. Acest controler este folosit pentru a anima obiecte de-a lungul traiectoriilor complexe (de exemplu, mișcarea unei mașini de-a lungul unui drum). Hai să apăsăm O.K(Fig. 18).


Orez. 18. Atribuirea controlerului de constrângere a căii

Acum mai jos, într-un scroll Lista de poziții singur afară Constrângere de caleși apăsați butonul Setați activ(Faceți activ). Într-un pergament Parametrii căii(Parametrii căii) faceți clic pe butonul Adăugați o cale(Assign Path) și selectați calea pre-creată. Asigurați-vă că bifați caseta de lângă Urma(Urmați), selectați axa dorită, dacă este necesar, reflectați cu Flip(Reflectați). Lanterna se va deplasa la începutul căii (Fig. 19).


Orez. 19. Scopul căii

6. Dacă începeți animația acum, lanterna se va mișca exact de-a lungul căii. Dar toate aceste acțiuni cu atribuirea controlorilor acum nu au fost de dragul animației, ci pentru ca obiectul să urmeze clar calea de care avem nevoie. Acum veți înțelege de ce avem nevoie de el.

Din meniul principal Instrumente(Instrumente) selectați un instrument instantaneu(Tipul de obiect) (Fig. 20). Este conceput pentru a crea o serie de obiecte de-a lungul căii de animație a obiectului original (în cazul nostru, animația felinarului de-a lungul căii).


Orez. 20. Locația instrumentului Snapshot

În fereastra care se deschide, bifați caseta de lângă Gamă(Pe cale), lăsați valorile de la 0 până la 100 de copii(Numărul de copii) setat la discreția dvs. Selectați metoda de copiere Instanță(Eșantion) și apăsați O.K. Vom vedea imediat cum luminile sunt plasate automat pe traseul pe care l-am desenat (Fig. 21).


Orez. 21. Utilizarea Instrumentului Snapshot

A mai rămas un punct important. Trebuie să eliminați acea lanternă originală cu animație, altfel se va mișca în cerc în videoclipul nostru de prezentare. Acest lucru este foarte ușor de făcut: acum este selectat, așa că fără a elimina selecția, apăsați butonul Șterge pe tastatură.

Dacă o lampă este în locul greșit, o puteți muta oricând „manual”. Ca rezultat, vom obține o scenă similară cu Fig. 22.


Orez. 22. Vedere finală după plasarea luminilor

7. Aranjați felinare în tot restul orașului. Acolo unde nu este foarte convenabil să utilizați plasarea „automată” a luminilor - faceți-o manual (Fig. 23).


Orez. 23. Lampioane aranjate

Sarcina 3

Aranjați singur grile mici în jurul parcului exact în același mod (Fig.).

1. Selectați grila mică și traduceți-o în Obiect proxy.

2. Mișcă-te punct de pivot la baza obiectului (Fig. 24).


Orez. 24. Punct de pivotare la baza obiectului

3. Desenați o cale pentru plasarea zăbrelei - Cerc putin mai mult decat inainte.

4. Atribuiți secvențial controlere Lista de pozițiiși Constrângere de cale. Faceți controlerul activ Constrângere de cale făcând clic pe butonul Setați activ. Atribuiți o cale pre-creată făcând clic pe butonul Adăugați o cale. Grila s-a deplasat la începutul căii și a stat perpendicular pe acesta (Fig. 25).


Orez. 25. Grile situat perpendicular pe cale

Acest lucru ar trebui corectat bifând caseta de lângă Urma(A urma). Puteți selecta axa dorită, dacă trebuie să reflectați folosind Flip(Flip) (Fig. 26).


Orez. 26. Zabrele situate de-a lungul potecii

5. Din meniul principal Instrumente alege un instrument instantaneu. În fereastra care se deschide, bifați caseta de lângă Gamă(Pe cale), lăsați valorile 0 până la 100 de copii(Numărul de copii) este stabilit la discreția noastră, principalul lucru este că grătarele se potrivesc perfect între ele. Selectați metoda de copiere Instanță, presa O.K(Fig. 27). Grilajele sunt plasate automat de-a lungul căii pe care am trasat-o.


Orez. 27. Utilizarea Instrumentului Snapshot

Ștergeți grila animată originală apăsând tasta Șterge pe tastatură.

Dacă o grilă este în locul greșit, de exemplu, chiar pe pistă, o puteți muta oricând „manual” sau o puteți elimina cu totul. Ca rezultat, vom obține o scenă similară cu Fig. 28.


Orez. 28. Vedere finală după plasarea grilelor mici

Sarcina 4

Instalează singur baruri mari în jurul caselor și școlilor. Undeva va trebui să le aranjați manual (de exemplu, unde sunt porțile), undeva acest proces poate fi automatizat. Rezultatul final ar trebui să fie ceva de genul Fig. 29, Fig. treizeci.


Orez. 29. Vedere finală după așezarea grătarelor mari


Orez. 30. Vedere finală după așezarea grătarelor mari

Sarcina 5

Așezați tufișurile automat de-a lungul căilor trase (Fig. 31, Fig. 32).


Orez. 31. Tufe aranjate


Orez. 32. Tufe aranjate

5. Aranjarea „automată” a obiectelor folosind plugin-ul MultiScatter - MultiPainter

Am luat în considerare deja câteva moduri de aranjare a obiectelor în scenă: „manual” și „automat” de-a lungul traseului. Dar dacă trebuie să aranjam literalmente milioane de copii ale unui obiect, cum ar fi iarba sau o pădure? Metodele deja familiare nu ne vor ajuta aici.

Probabil ai auzit deja despre Multidifuzie. Acesta este un plugin pentru 3Ds max cu ajutorul căruia puteți crea ușor și ușor scene cu milioane de obiecte. Noua versiune de MultiScatter include un modul nou și foarte util MultiPainter. Vă permite să „pictați” obiecte pe o suprafață folosind o perie virtuală. Desenarea poate avea loc atât pe o suprafață, cât și pe mai multe simultan. Puteți desena cu mai multe obiecte diferite simultan. Prin urmare, MultiPainter este ideal pentru sarcinile noastre.

1. Descărcați și instalați pluginul Multidifuzie.2. Selectați smocuri de iarbă și traduceți-le Obiecte proxy (clic dreapta > Export mesh VRay). În caseta de dialog care se deschide, specificați numele și folderul, bifați caseta Creați automat proxy. Clic O.K.

3. Verifică asta punct de pivot era la baza smocuri de iarbă.

4. Acum putem aranja aceste obiecte folosind MultiScatter - MultiPainter. Pentru a face acest lucru, pe fila Crea alege geometrieși selectați din lista verticală Multidifuzie, apasa butonul MultiPainter.

După aceea, asigurați-vă că îi puneți denumirea direct în scenă - pentru a face acest lucru, țineți apăsat butonul stâng al mouse-ului și trageți cursorul în orice direcție (Fig. 33).


Orez. 33. Desemnarea MultiPainter

5. După aceea, accesați fila Modifica. Aici vedem parametrii noului instalat MultiPainter.

Într-un pergament Pictează obiecte(Obiecte de desen) în secțiune Împrăștia obiecte(Obiecte pentru plasare) trebuie să specificați obiectele cu care vom desena. Hai să apăsăm butonul +ceainicși selectați obiectele noastre din scenă. Buton + lista vă permite să selectați obiecte din listă, nu din scenă. Alegeți obiectele în modul care vi se potrivește cel mai bine. Buton -fierbător este responsabil pentru îndepărtarea obiectelor de desen.

După ce specificați obiectele de desenat, două opțiuni vor deveni disponibile - Probabilitate(probabilitate, densitate) și Rata de coliziuni(Valoarea coliziunii). Acestea sunt cele care trebuie configurate. Deocamdată, să setăm valoarea pentru fasciculul verde Probabilitate 200, rata de coliziune 5, iar pentru grinda îngălbenită Probabilitatea 10, rata de coliziune 5.

În capitolul Opțiunile pensulei(Setările pensulei) pot fi ajustate Rază(Rază), moliciune(Edge Softness) și Intensitate(Intensitate, forta de presare) perii. Sa punem Raza 100, moliciune 1, Intensitate 80. Iată cele mai importante butoane A picta(tragere) și Şterge(Şterge).

Într-un pergament Suprafețe(Suprafețe) este necesar să se precizeze suprafața(le) pe care se va realiza desenul. Butoanele vă sunt deja familiare, acțiunea lor este similară cu cele anterioare. Indicăm aici suprafața gazonului nostru.

Într-un pergament Roti(Rotație) Puteți specifica câte grade se pot roti obiectele atunci când sunt desenate. Pune pe ax Z valoarea de rotatie 360 grade pentru a face smocuri de iarbă să pară diferite și să nu se repete.

Într-un pergament Scară(Scalare) puteți specifica cât de mult vor diferi obiectele ca scară unele de altele. Să setăm valoarea Din(Din) 90 , La(Inainte de) 100 .

Într-un pergament previzualizare(Previzualizare) puteți selecta modul de afișare al obiectelor din fereastra de vizualizare. Casetă - fiecare obiect va fi sub forma unei casete, Cruce - sub formă de cruce, Puncte, Număr - sub forma unui set de puncte, Niciunul - nu va fi afișat în nici un fel în fereastra, ceea ce poate fii de mare ajutor într-o scenă grea.

Toate setările necesare sunt prezentate în Fig. 34.


Orez. 34. Setări MultiPainter

6. Deci, am instalat toți parametrii și setările de care avem nevoie. Acum selectați ambele grinzi din secțiune Împrăștia obiecteși apăsați butonul A picta(A desena). Vopsim cu o perie direct pe gazonul nostru (Fig. 35).


Orez. 35. Pictura cu pensula

Cât de reușiți au parametrii setați pentru scenă poate fi văzut doar după randarea preliminară. Să ne uităm la rezultat prin redarea imaginii (Fig. 36). Dacă este necesar, modificați parametrii necesari.


Orez. 36. Ciorchini de iarbă aranjate în scenă

Sarcina 6

Aranjați smocuri de iarbă în tot orașul, aranjați copacii în oraș (Fig. 37) și dincolo (Fig. 38) în același mod.


Orez. 37. Așezat în oraș iarbă și copaci


Orez. 38. Amplasat în afara orașului iarbă și copaci

Notă: pentru a economisi resursele computerului, puteți plasa obiecte doar acolo unde camera va zbura.

Este interesant!

Și nu cu mult timp în urmă, am dat peste un articol interesant despre dezvoltarea jocurilor mobile folosind Unity (datat 12 august 2015); totuși, avantajul cheie al articolului este că compară acest instrument cu principalul său concurent: Unreal Engine.

Cu acest minunat studiu vă invităm să faceți cunoștință vineri seara. În comentarii, vom fi bucuroși să vedem recomandări pentru publicarea cărților despre UE și, de asemenea, sperăm la o discuție fructuoasă.

Articol tradus cu abrevieri minore

Noi (OnlineFussballManager GmbH) începem în prezent să dezvoltăm un nou proiect pentru dispozitive mobile. Vom crea o combinație incitantă și unică de strategie pe rând și joc de manager de fotbal.

Jucătorii vor putea să-și planifice și să-și creeze propriile zone de club și facilități sportive, să antreneze echipa și să lucreze la tactica acesteia. Jucătorii de echipă nu vor fi doar unități în tricouri numerotate, ci personalități realiste cu propriile trăsături și chiar expresii faciale. Totul se va desfășura într-o vedere izometrică a diferitelor săli și zone ale clubului, unde clădirile animate vor fi amplasate într-o grilă special definită.

Așadar, momentul adevărului a venit când ne-am propus să dezvoltăm reprezentarea vizuală.
Având în vedere cerințele puse în fața noastră și faptul că trebuie să dezvoltăm acest joc atât pentru iOS, cât și pentru Android - cum să implementăm acest proiect din punct de vedere tehnic?

Una dintre primele întrebări care a trebuit să fie decisă a fost dacă să ne creăm propriul motor sau să îl folosim pe cel existent. Desigur, prima opțiune este optimă dacă doriți să aveți control deplin asupra a tot ceea ce se întâmplă în codul sursă, lanțul de instrumente și, de asemenea, să înțelegeți pe deplin care va fi venitul dvs. din acest joc. Dezavantajul acestei abordări este că o astfel de dezvoltare va necesita un efort considerabil - din cauza căruia termenii întregului proiect vor crește, iar prețul va crește semnificativ. Am abandonat rapid această idee, deoarece am vrut să menținem costul și calendarul proiectului în limite rezonabile.

Desigur, puteți da o mulțime de argumente despre ce motor este mai bun și în ce scopuri. Câți oameni - atâtea păreri. Trebuie să recunoaștem că la un moment dat și noi am simțit un asemenea subiectivism. Echipa a susținut activ Unreal Engine. Oricum, oricat ne-am uita la UE, nimeni nu o putea caracteriza obiectiv, fara a apela la parerea personala.

Așadar, am decis să nu fim distrași de la fapte și am început să explorăm alte instrumente, mai cunoscute.
GameMaker a fost abandonat în curând, deoarece era mai orientat către începători care tocmai începuseră în dezvoltarea jocului. Așadar, este destul de ușor de învățat, dar capacitățile lui GameMaker au fost în mod clar sub ceea ce ne-am dorit să facem.

A urmat rândul lui Cocos2D, care la prima vedere părea promițător. După cum sugerează și numele, Cocos2D este optimizat pentru dezvoltarea jocurilor 2D. Deci, întrebarea a fost dacă doream să creăm grila noastră izometrică de clădire în 2D adevărat sau în 3D real cu un punct de vedere fix. După câteva cercetări suplimentare, am optat pentru o implementare 3D. În acest caz, Cocos2D evident nu ni s-a potrivit.

Ne-am îndreptat către Marmelade. La urma urmei, cu ajutorul Marmeladei, jocuri celebre precum „Plants vs. Zombi și „Godus“. Dar, deși am găsit o mulțime de avantaje în acest motor, au apărut probleme care ne-au obligat să apelăm la alte opțiuni. Unul dintre cele mai mari dezavantaje a fost că comunitatea Marmelade este destul de mică.

Deci, dintre alternativele majore, au rămas doar Unreal și Unity. Dar nici până în acest punct, nu am putea alege cu încredere unul dintre cei doi fără ajutor.

Din fericire, se apropia conferința de jocuri GDC din San Francisco, așa că am profitat de șansa să zburăm acolo și să ne consultăm cu colegii.

Ne-am întâlnit acolo pe băieții de la Epic, ne-am familiarizat cu Unreal Engine, am încercat Paper 2D, instrumentul lor de vizualizare a previzualizărilor aplicațiilor mobile și am întrebat ce ar trebui să folosim: motorul lor sau Unity?

Băieții ne-au înveselit, spunând așa ceva: „Unreal este cool, dar nici Unity nu este rău. Încearcă pe amândouă.”

Apoi am mers la dezvoltatorii Unity și ne-am uitat la Unity 5 - cum îmbunătățește performanța în iOS. Până la urmă, le-au pus aceeași întrebare și au primit un răspuns similar.

În această etapă, ne-am hotărât asupra unui studiu tehnic aprofundat. Am proiectat un prototip care seamănă foarte mult cu proiectul nostru pentru a testa pe diferite dispozitive mobile cum va decurge procesul de construire și care va fi performanța. În același timp, am vrut să aflăm și ce capcane și probleme ne pot aștepta atunci când dezvoltăm primul și al doilea motor.

Întrucât toți programatorii noștri erau ocupați cu proiectele curente, am încredințat munca la prototip specialiștilor de la Bit Baron.

Cercetarea motorului de către Bit Baron

»Online Fußball Manager« (OFM) a planificat să creeze un joc mobil. Ni s-a cerut ajutor pentru a decide cu mai multă încredere care motor este cel mai bun pentru proiectul lor. Până atunci, dezvoltam exclusiv jocuri cu browser, dar am decis că ne putem descurca cu sarcina. S-a propus compararea a două opțiuni: Unitate și Ireal. În prezent, acestea sunt două „locomotive” în lumea programării jocurilor. Există destul de multe rapoarte care ilustrează în detaliu diferențele minuscule dintre cele două. Dar particularitatea muncii noastre a fost că am scris două aplicații de testare aproape identice pentru comparare și le-am caracterizat performanța în conformitate cu sistemul de puncte de control (benchmarking).

Scriind două aplicații similare, am reușit să le testăm pe ambele pe condiții echitabile, să spunem OFM care versiune are performanțe mai bune și să evidențiem probleme suplimentare.

caz de testare

Am vrut să creăm un benchmark care să ofere OFM informații direct legate de tipul de joc pe care îl creează. Clienții au indicat că prototipul ar trebui să aibă mai multe clădiri și copaci animate. Prin urmare, am creat o scenă 3D în care utilizatorului i s-a cerut să plaseze singur aceste obiecte pe hartă. Grila avea dimensiunea de 11x16 și conținea până la 176 de clădiri. Fiecare pătrat de grilă a susținut până la 6 copaci, astfel încât ar putea fi peste 1000 de copaci în scenă. Am adăugat o interfață de utilizator simplă în care puteți adăuga un număr specificat de copaci și clădiri la scenă. Am adăugat și funcția de adăugare a clădirilor în anumite locuri - pentru aceasta trebuia să dați clic pe hartă în punctul dorit. În ceea ce privește organizarea programului, am construit o grilă pe un plan, și am văzut scena printr-o cameră situată „deasupra capului utilizatorului”. Am adăugat, de asemenea, o funcționalitate dedicată camerei pentru a permite utilizatorului să mărească și să deplaseze scena. Deoarece acest prototip a fost făcut pentru a decide asupra unui motor de dezvoltare, am făcut tot posibilul să facem ca scena să arate aproape la fel în ambele versiuni. În caz contrar, ar fi imposibil să comparăm calitatea vizuală a primei și a doua opțiuni. A fost nevoie de puțină muncă pentru a face acest lucru, deoarece unele lucruri sunt tratate diferit în Unreal și Unity. Drept urmare, avem două scene foarte asemănătoare.

Pentru a unifica testarea performanței, am dorit să folosim modele de arbore și de construcție identice în ambele sisteme. Pentru arbori, am folosit modelul mobil SpeedTree, care a inclus doar aproximativ 1000 de poligoane și a făcut posibil să se evalueze bine modul în care incrementele mici ale triunghiurilor afișate afectează rata de cadre. În ceea ce privește clădirile animate, nu am putut găsi un model pentru ele care să funcționeze cu ambele motoare, așa că am aplicat două modele diferite. Ambele au fost proiectate pentru puțin peste 16.000 de poligoane fiecare și aveau setări de material aproape identice. Am dezactivat complet nivelurile de detaliu (LOD), astfel încât ambele opțiuni să arate același număr de triunghiuri la orice distanță de cameră. Testul a fost conceput nu numai pentru a reflecta diferențele de performanță dintre cele două motoare, ci și pentru a arăta diferența de calitate a redării. În plus, a trebuit să monitorizez îndeaproape shaderele standard Unreal Engine. Deși remarcăm că Unreal arată clar mai bine, am constatat că există o serie de shadere care operează în cameră care sunt costisitoare din punct de vedere al performanței. După ce le-a oprit, scena nu s-a schimbat prea mult vizual. Iluminatul a prezentat o problemă foarte diferită, așa că ne-a luat ceva timp să o rezolvăm corect.

Clienții au fost interesați nu doar de testele de randare, ci și de ceea ce ar fi impresiile dezvoltării pe primul și al doilea motor. La urma urmei, ce rost are productivitatea dacă nu poți scrie un joc la timp. Pentru a sublinia aceste experiențe, am comparat, de asemenea, factori precum timpul de construire, documentația disponibilă, complexitatea implementării într-un mediu mobil și complexitatea iterațiilor de cod. Am crezut că Unity va fi mai puternică în acești indicatori (ca un flagship în domeniul dezvoltării jocurilor mobile).

Proiectul Unitate

Prototip în Unity. Pe hartă sunt 200 de copaci

Bun

  • Elementele de bază ale Unity sunt obiectele (»GameObject«) și componentele (»MonoBehaviour«). Odată ce ați stăpânit acest concept, sunteți gata să lucrați cu Unity. Dacă este utilizat corect, acest sistem poate îmbunătăți foarte mult organizarea proiectului.
  • Unity vine cu multe componente care vă oferă tot ce aveți nevoie pentru a crea un joc - cu excepția logicii jocului în sine. După cum am menționat mai sus, componenta poate fi la fel de mică ca Plane (nu în Unreal) pe care l-am folosit pentru a construi plasa. Cele mai recente completări ale motorului sunt componentele »UI« și »Layout«, permițând crearea de interfețe grafice puternice și scalabile pentru utilizator.
  • Editorul poate fi extins cu propriile scripturi și există o mulțime de resurse disponibile în Magazinul de active pentru toate ocaziile. Magazinul de active conține, de asemenea, o mulțime de scripturi utile, modele de materiale etc. Acestea vor fi deosebit de utile atunci când faceți prototipuri - puteți pur și simplu să descărcați tot ce aveți nevoie ca resurse temporare și să le utilizați ca modele de simulare la îndemână.
  • Unity a fost unul dintre primele motoare open source care a susținut dezvoltarea mobilă. Prin urmare, este foarte convenabil atunci când este implementat într-un mediu mobil, arată și acționează acolo aproape în același mod ca și în editor. Sistemul este îmbunătățit în mod constant, iar implementarea se desfășoară foarte bine. Acesta a fost un factor semnificativ care ne-a determinat să decidem să facem un prototip mobil.
  • Unity se mândrește probabil cu cea mai mare comunitate de specialiști din orice motor de joc, așa că dacă aveți o întrebare, cel mai probabil va exista un răspuns la aceasta. Deși Unity acceptă multe limbaje de scripting, documentația pentru fiecare este foarte detaliată. Mai mult, chiar dacă găsești un răspuns într-o altă limbă, logica acelui răspuns îți va fi în continuare clară și îl poți adapta pentru a-ți rezolva problema.
  • Unity a făcut o treabă grozavă de optimizare a randării pentru multe obiecte de același tip. Pentru a obține performanțe comparabile în Unreal, ar trebui să utilizați Instanced Rendering, iar acest mecanism este de obicei mai puțin flexibil decât redarea în Unity.

rău

  • Codul sursă al motorului este închis. Dacă negociezi cu Unity prețul codului sursă, atunci trebuie să-l suporti. Prin urmare, problemele sunt posibile dacă una sau alta caracteristică pe care vă bazați eșuează - va trebui să așteptați o actualizare.
  • Noul sistem UI este destul de bun. Nu există un editor special în el, toate modificările sunt făcute chiar în scenă - iar scena este foarte mare. Când deschideți o scenă și doriți să editați interfața de utilizare, mai întâi trebuie să măriți foarte mult zona de interes.

Aceasta este o poză din editorul Unity. Suntem foarte norocoși că am reușit să-l completăm cu propriile noastre scenarii.

Teribil

  • Există două probleme cu noul sistem UI din Unity. Când apăsați cu degetul pe ecranul tactil, nu veți putea spune dacă o anumită grafică a fost apăsată. Să presupunem că utilizatorul dorește să rotească ecranul folosind un glisor. Dar dacă am moștenit clasa GraphicsRaycaster, atunci putem deschide orice date dorite care pot fi făcute publice. Dacă înlocuiți GraphicsRaycaster în obiectul canvas, puteți verifica dacă elementul UI a fost făcut clic.
  • A doua problemă cu interfața cu utilizatorul Unity are de-a face cu scalarea pentru afișaje de diferite dimensiuni. Practic, obiectul canvas are opțiuni de scalare cu unii parametri. Dar organizarea previzualizării lor a fost foarte dificilă, a trebuit să implementăm aplicația pe dispozitiv de mai multe ori până am preluat o configurație normală.
  • În plus, am fost foarte nedumeriți de panoul de statistici al Unity. După ce am implementat contorul de frecvență a cadrelor din joc, am comparat valoarea acestuia cu ceea ce a fost afișat pe panoul de statistici al editorului Unity. Aceste valori sunt diferite. După ce am căutat pe Internet alte opțiuni de implementare, am găsit răspunsul: panoul de statistici oferă o estimare a câte cadre ar pierde jocul dacă ar funcționa offline, și nu în editor. Prin urmare, logica contorului nostru de cadre a fost absolut corectă.

Valori FPS 37 vs. 32. În panoul de statistici Unity, vedem date estimate pentru o aplicație autonomă care nu se potrivește cu cele reale

Proiect Ireal

Iată cum arată proiectul în editorul Unreal. Există multe editoare imbricate specializate, dintre care unele sunt comparabile ca funcționalitate cu programe întregi.

Aceeași captură de ecran făcută în UE ca în Unity (vezi mai sus), cu setările mobile rămase implicite, fără iluminare în copac

Când setările au fost ajustate, copacii au ieșit mai bine, dar încă nu la fel de buni ca în Unity

Bun

  • Versiunea de încercare a lui Unreal este complet gratuită. În el veți obține un editor cu funcții complete. Unity are și o versiune gratuită, dar upgrade-ul la Pro va costa o avere.
  • Unreal are un editor puternic care include mai mulți editori foarte specializați. Dacă sunteți familiarizat cu acești editori „imbricați”, ei vă vor ajuta foarte mult cu dezvoltarea și, adesea, vă vor oferi informații pe care nu le veți vedea în Unity. Există editori care pot servi chiar și ca înlocuitori cu drepturi depline pentru unele programe. Interacțiunea tuturor acestor subsisteme este pur și simplu o capodopera.
  • Motorul vine cu tot codul sursa. Prin urmare, puteți săpa în el și să înțelegeți cum funcționează părțile individuale. Mai mult, puteți chiar să remediați erorile din motor sau să-i completați singur funcționalitatea.
  • Vizualizarea în editor este grozavă. Doar că ochii sunt mari de la abundența de opțiuni de randare (legate, de exemplu, de complexitatea luminii sau a umbririi). Aici veți găsi o mulțime de shadere de ultimă generație care vin și cu motorul. Practic, Unreal oferă cel mai bun motor de randare de pe piață. Puteți crea scene uimitor de frumoase.
  • Planurile sunt utile pentru a crea rapid ceva simplu și pentru a implementa logica de bază a jocului. Se integrează perfect cu C++, iar această decizie nu a fost luată întâmplător: nu numai că deschide cele mai largi posibilități atât pentru începători, cât și pentru dezvoltatorii experimentați, dar le permite și să interacționeze între ei.
  • Integrarea generală cu C++ este excelentă. Ca o reîncărcare fierbinte.

Planurile sunt excelente pentru sarcini simple, integrarea lor cu C++ este fantastică. Dar dacă este implicată o logică mai complexă, atunci acestea devin rapid o mizerie și devine dificil să le faci față.

rău

  • Când dezvoltați pe Unreal Engine, este greu să accelerați ritmul. Chiar dacă cunoașteți foarte bine C++, va dura mult timp pentru a învăța diferitele macrocomenzi și funcții ale UE4. Acest lucru poate fi foarte dificil pentru cei care învață C++ în același timp.
  • Desenele pot deveni confuze foarte repede. Când logica include zeci de noduri, fiecare dintre ele conține un plan, uneori poate fi simplificată la câteva linii de cod scrise în C++ simplu. De obicei, aceasta nu este o problemă, deoarece este perfect posibil să lucrați cu C++, dar cu unele lucruri precum »UMG« (sistem UI) trebuie să utilizați planuri și poate fi confuz.
  • Simulatorul mobil s-a dovedit a fi foarte inconsecvent. A dat avertismente când am încercat să folosim funcții de shader care nu sunt folosite într-un mediu mobil, dar chiar dacă shader-ul a trecut validarea, s-ar putea să nu funcționeze. În principiu, acest simulator este un lucru bun, dar calitățile sale vizuale lasă de dorit.
  • Deși Unreal are o comunitate mare de dezvoltatori, rareori primim răspunsuri la întrebări. În plus, aproape tot sprijinul oferit nouă a fost legat de desene. Unreal Engine 4 crește activ comunitatea, deja merge bine, se pare că specialiștii sunt dornici să dezvolte și să ajute. Dar comunitatea Unity este încă mai bună.

Teribil

  • Există o lipsă gravă de documentație C++. Materialul de referință online pentru clasele C++ este incomod. În plus, datorită actualizărilor constante, multe funcții devin rapid învechite. Fiți atenți când vizionați videoclipuri de ajutor, deoarece acestea pot descrie o versiune învechită a motorului și funcții care nu mai sunt utilizate.
  • Lucrând cu GUI, am folosit sistemul inovator »UMG«. Se bazează pe planuri și poate fi foarte util. Cu puțină muncă, am reușit să moștenim clasa C++ și să curățăm puțin planurile. Cu toate acestea, sistemul este încă brut, lipsind unele comenzi, cum ar fi butoanele de comutare. În plus, există puțină sau deloc documentație relevantă C++. Editorul a căzut de mai multe ori în timp ce dezvoltam interfața de utilizare. Eșecurile neașteptate pot costa ore întregi de timp de lucru, sunt destul de enervante. Dezvoltarea acestui sistem este în desfășurare, dar până acum este departe de a fi perfectă.
  • Dezvoltarea mobilă cu Unreal este lentă. Programul durează foarte mult timp pentru a fi implementat pe dispozitiv. Au existat unele probleme vizuale cu Android, cum ar fi contururi neclare și copaci neluminați. În iOS, problemele erau mult mai grave. UE4 acceptă crearea pentru un dispozitiv iOS numai dacă aplicația dvs. constă numai din planuri. Este vina Apple, dar am mers până la capăt pentru a importa cheile de dezvoltare (vă puteți imagina) înainte de a întâlni această problemă. În iOS, texturile copacilor construiți pe baza SpeedTree nu erau afișate, copacii erau gri și goi, fără frunze. Deci, suportul pentru dezvoltarea mobilă în Unity câștigă semnificativ în comparație cu Unreal.

Rezultate de referință. rata de cadre

În mod surprinzător, la testarea ratei cadrelor (FPS) pe diferite dispozitive, am obținut rezultate foarte diferite. Pe unele dispozitive, Unity a câștigat cu orice configurație. Cu alte ocazii, Unreal a depășit-o pe Unity la testele în care erau multe clădiri. Practic, Unreal a câștigat, dar la un preț mare. Calitatea și consistența imaginii în Unity au fost semnificativ mai bune. Texturile ireale păreau neclare pe unele dispozitive, copacii s-au dovedit mult mai rău. Diferența de calitate s-a datorat parțial faptului că este afișată pe de o parte în editorul Unreal și previzualizarea mobilă, iar pe de altă parte - pe un telefon mobil real. Această problemă a fost evidentă mai ales când vine vorba de iluminatul scenei. A fost foarte greu să faci setările corecte pentru a obține luminile corect, întreaga setare de pe dispozitivele mobile arăta adesea întunecată. În acest sens, Unity a fost mult mai consistent, imaginea de pe orice smartphone era aceeași ca la previzualizare în editor.

Rezultatele pentru ambele motoare s-au dovedit a fi mult mai bune decât ne așteptam (după cum vă amintiți, modelele noastre de testare au avut de aproximativ 10 ori mai multe triunghiuri decât în ​​jocurile mobile obișnuite).

În iOS, ambele motoare au redat modele animate cu aproximativ același succes. Cu toate acestea, testele cu arbori pe acest dispozitiv au fost neconcludente, deoarece Unreal nu a afișat nicio texturi pe modelele de arbori. Am încercat să găsim motivul acestui model, dar nu l-am putut rezolva. În plus, ar trebui să reținem că atunci când implementați folosind aceste motoare, trebuie să aveți un computer Apple la îndemână. Acest lucru este foarte incomod, dar Apple însuși este de vină pentru această situație. Clienții ne-au cerut, de asemenea, să efectuăm teste de referință pe Windows Phone. Din păcate, Unreal nu acceptă încă implementări pe telefoanele Windows, așa că Unity câștigă aici prin definiție. Întrucât Windows Phone ocupă în prezent o cotă de piață foarte mică, dezvoltarea Unreal în această direcție nu este considerată o prioritate.

În cele din urmă, analiza comparativă a arătat doar că cele două motoare erau aproape egale ca putere. Prin urmare, este deosebit de important să acordați atenție avantajelor și dezavantajelor specifice fiecăruia dintre ele. În cele din urmă, dacă performanța este atât de apropiată, atunci confortul și viteza de dezvoltare pentru fiecare dintre aceste motoare ies în prim-plan.

Alți parametri de control

Iată câteva rezultate mai interesante pe care am reușit să le aflăm în timpul testelor noastre:

  • Ambele motoare aproape că nu diferă în ceea ce privește consumul de memorie. Pe dispozitivele Android, Unity a câștigat puțin, pe dispozitivele iOS - Unreal.
  • Proiectul Unity este semnificativ mai mic (Android: 42 MB / iOS: 100 MB) decât Unreal (Android: 101 MB / iOS: 173 MB).
  • Unity este de aproximativ trei ori mai rapid de implementat pe un dispozitiv. În plus, Unity compilează codul mult mai rapid.
  • Unreal a fost mult mai economic în ceea ce privește durata de viață a bateriei. După două ore de lucru cu 150 de modele animate pe ecran, Unreal a reușit să consume bateria Android cu 42% și iOS cu 36%. Unity a consumat aproximativ 72% pe Android și 47% pe iOS pentru aceeași configurare și timp de rulare.

concluzii

Conform rezultatelor studiului, ne-au plăcut foarte mult la ambele motoare. În plus, am găsit multe domenii în care aceste instrumente pot fi îmbunătățite pentru a facilita funcționarea programatorului. Niciunul dintre motoare nu a avut un avantaj semnificativ față de celălalt, având în vedere cât de repede se schimbă capacitățile și suportul lor. Testele de randare au arătat că ambele produse scot la maximum din dispozitiv și, în principiu, sunt destul de comparabile. Din nou, în această situație, utilitatea și intuitivitatea dezvoltării vin în prim-plan. Având în vedere tot ce am învățat despre aceste motoare și provocările cu care ne-am confruntat în timpul dezvoltării, ne-am confruntat cu o alegere dificilă, dar până la urmă am ales Unity.

În ciuda faptului că inițial am pariat pe Unreal Engine pentru a câștiga, Unity este în prezent opțiunea mai câștigătoare, cel puțin când vine vorba de dezvoltarea jocurilor mobile.

Iată principalele motive ale deciziei noastre:

  • Unity pare vizual mai consistent pe toate dispozitivele și se implementează rapid cu un singur clic pe orice platformă.
  • Unity ocupă mult mai puțin spațiu pe dispozitiv, un impact mai mic asupra experienței utilizatorului final. Dimensiunea compactă este deosebit de importantă în Google Play Store, unde APK-ul trebuie împărțit în părți dacă acest fișier este mai mare de 50 MB.
  • Unitatea este mult mai ușor de învățat și de înțeles. Înarmat cu Unity, utilizatorul fără experiență se poate pune în funcțiune mai rapid și poate construi produse care sunt susținute de o mare comunitate de experți.
  • Timpul de iterație în Unity este mult mai scurt (implementarea și compilarea codului sursă sunt mai rapide, shaders-urile se compilează aproape instantaneu)

Dorim să subliniem că rezultatele noastre trebuie privite în contextul prototipului realizat. Ceea ce funcționează pentru o companie poate să nu funcționeze pentru alta. În plus, există multe mai multe motoare de joc, dintre care unele pot fi mai potrivite sarcinii tale specifice. În unele companii, cu suficient timp și resurse, poate avea chiar mai mult sens să-și scrie propriul motor. În dezvoltarea jocului, nu există o soluție universală. Fă-ți o favoare și experimentează corect. Mai mult, multe dintre ele devin mai ieftine sau chiar devin shareware precum Unreal. Nu vom fi surprinși dacă Unity urmează și exemplul lui Unreal și liberalizează modelul de prețuri.

Concluzie

Este interesant de observat că băieții de la Bit Barons ne-au sfătuit să luăm Unreal Engine pentru proiectul nostru înainte de a crea prototipul. Având în vedere că noi cei de la OFM am preferat inițial Unreal Engine, poate că soluția finală s-a dovedit a fi suboptimă.

Desigur, nu este ușor să proiectați, să scrieți și să testați un prototip, mai ales dacă trebuie doar să vă decideți asupra unui motor pentru un proiect. Dar întrebarea unei astfel de alegeri este extrem de importantă.

În cele din urmă, am mai luat în considerare câțiva factori care ne-ar putea schimba părerea. Și anume: cât de ușor este să găsești specialiști cu experiență pentru fiecare motor în prezent și care sunt modelele de afaceri disponibile?

În problema personalului, ne-am consultat cu recrutori experimentați pentru a afla numere mai mult sau mai puțin reale. În prezent, există aproximativ patru profesioniști Unity pentru fiecare specialist Unreal. În ceea ce privește modelul de afaceri, Unreal nu oferă o taxă inițială fixă, ci necesită redevențe. În Unity, totul este exact invers. Ambii acești factori au fost importanți pentru noi și, ca urmare, ne-am hotărât în ​​continuare pe Unitate.

Deci, construirea unei baze în strategie. Parametrii care sunt implicați în acest proces pot fi foarte diferiți. Poate aur sau minerale, disponibilitatea energiei și așa mai departe. Fiecare proiect poate avea ceva individual, însă, lucrul comun pentru toți este construcția în sine, adică aranjarea obiectelor într-o anumită zonă. Ce trebuie să facem? În primul rând, avem un set de icoane, fiecare reprezentând o clădire. Când faceți clic pe pictogramă, obținem o clădire goală care poate fi mutată de-a lungul planului XZ. În al doilea rând, trebuie să vă asigurați că nu pot fi create clădiri noi acolo unde există deja o clădire și unde este interzis să construiți ceva.


Această opțiune este potrivită numai pentru 3D, pentru un proiect bidimensional este necesar să se refacă raycast-ul și planul de mișcare al obiectelor.

Instruire. Crearea clădirilor în sine, modele de clădiri. Nu contează cum vor fi animate și așa mai departe, modelul principal trebuie să fie sub colider, acest lucru este necesar nu numai pentru construcție, ci și pentru crearea unei hărți de navigare pentru roboți. De exemplu:

Ciocnitorul trebuie să acopere întregul obiect.

După crearea structurii principale, facem o copie a acesteia și înlocuim materialul. Adică, sarcina este de a crea o previzualizare a viitoarei clădiri. În orice strategie, tragem mai întâi aspectul clădirii, de obicei făcându-le translucide. Deoarece acesta este un aspect, eliminăm animația de pe acesta dacă există și selectăm aspectul, de exemplu:


În același mod, obiectul trebuie să fie închis de către ciocnitor, dar în modul Este Trigger. În acest caz, ciocnitorul de aspect poate fi făcut puțin mai mare decât originalul, cu +0,1 de exemplu, acest lucru va crește sensibilitatea și va asigura că este imposibil să creați un obiect peste altul. Toate aspectele trebuie să aibă setat stratul Ignorare Raycast!În plus, ne agățăm de model Corp rigidși opriți gravitația. În plus, agățăm un mic scenariu MaskControl:

Utilizarea UnityEngine; folosind System.Collections; clasă publică MaskControl: MonoBehaviour ( șir public 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; ) ) )
Sarcina acestui script este de a determina unde poate fi instalat obiectul și unde nu. Într-o variabilă respawnTag specificam o eticheta care permite instalarea. Să presupunem că dacă faci un avion cu o etichetă, atunci clădirea poate fi construită doar în această zonă, iar dacă obiectul se împiedică de alte clădiri, se va bloca automat. În general, totul este ca o strategie obișnuită.

În continuare, numele clădirilor. Prefabricatele originale ale clădirii sunt numite astfel id_xxx, adică - număr, liniuțe, nume. Prefabricatele de aspect sunt numite exact la fel, numerele originale și de aspect - trebuie să se potrivească, iar numele pot varia.

Acum agățăm un script pe un obiect gol Trage si lasa:

Utilizarea UnityEngine; folosind System.Collections; folosind System; clasă publică 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 în original) ( string name = obj.name.Split(new char ("_"), StringSplitOptions.RemoveEmptyEntries); if(id.ToString( ) == nume) ( original_tmp = Instantiate(obj); original_tmp.gameObject.SetActive(false); ) ) foreach(Transform obj în mască) (nume șir = obj.name.Split(car nou ("_"), StringSplitOptions .RemoveEmptyEntries); if(id.ToString() == nume) ( mask_tmp = Instantiate(obj); ) ) ) void Update() (Lovitură RaycastHit; Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); dacă ( Physics.Raycast(ray, out hit)) ( curPos = hit.point + hit.normal * shift; ) if(mask_tmp) ( mask_tmp.position = curPos; dacă (Input.GetAxis("Mouse ScrollWheel") > 0) ( mask_tmp.localEulerAngles += new Vector3(0, 45, 0); ) if(Input.GetAxis("Mouse ScrollWheel")< 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); } } } }
original- o serie de toate prefabricatele cu modele de clădire originale.

masca- o serie de toate prefabricatele de aspect.

schimb- deplasarea axei Y pentru model.

respawnTag- eticheta avionului pe care este permisă construcția.

Trebuie să adăugăm câteva la scenă. UI elemente, mai precis pictograme, GameObject > UI > Image. Creăm numărul necesar de pictograme, le plasăm după cum este necesar. Apoi, pe fiecare pictogramă, trebuie să adăugați o componentă Declanșare eveniment, selectați funcția Pointer Clickși apoi trageți obiectul cu scriptul DragAndDrop în câmpul activ și selectați funcția de script din meniu - setmaskși indicați numărul aspectului. De exemplu:


Adică, linia de jos este că fiecare pictogramă corespunde unui anumit model, așa că atribuim numere. În joc, faceți clic pe pictogramă - trimiteți numărul la script - găsește modelul corespunzător. Așa funcționează.

LMB pe pictogramă - obțineți aspectul clădirii. LMB repetat - setați clădirea. RMB - anulați. Rotița mouse-ului - rotiți.

Top articole similare