Unitate acum gândiți la componente

În timp ce Unitatea este o platformă uimitoare pentru gamedev, obișnuirea cu ea va necesita un pic de muncă inițială, deoarece va trebui probabil să vă schimbați știfturile cognitive pentru a le înțelege componentă bazată pe arhitectură.

În timp ce programarea obișnuită orientată pe obiecte (OOP) poate fi utilizată, fluxul de lucru Unity se bazează foarte mult pe structura componentelor - ceea ce necesită gândire pe componente. Dacă sunteți familiarizat cu componentele, este grozav; dacă nu, nu este o problemă. Aici, vă dau un curs de prăbușire pe componentele din Unitate.

Imagine de previzualizare: Old Cogs de Emmanuel Huybrech.


Ce este o componentă?

Înainte de a continua cu modul de lucru și de gândire cu componente, să ne asigurăm că înțelegem pe deplin exact ce sunt.

În lumea programării, conceptele componentelor și decuplarea merg mână în mână. O componentă poate fi considerată ca o bucată mai mică dintr-o mașină mai mare. Fiecare componentă are propria sarcină specifică și poate realiza în general (și în mod optim) sarcina sau scopul său fără ajutorul unor surse externe. În plus, componentele aparțin rareori unei singure mașini și pot fi unite cu diferite sisteme pentru a-și îndeplini sarcinile specifice, dar pot obține rezultate diferite atunci când vine vorba de o imagine mai mare. Acest lucru se datorează faptului că componentele nu numai că nu le pasă de acea imagine mai mare, dar, de asemenea nici măcar nu știu că există.

Un exemplu clasic de componente sunt piesele unei mașini - dar asta e plictisitor, pentru că nu prea sunt în mașini. În schimb, ia în considerare un controler Xbox 360. Tt are două stick-uri analogice, diverse butoane, declanșatoare și așa mai departe. Nu numai că întregul controler este el însuși o componentă, dar fiecare aspect individual al controlerului este o componentă.

Fotografie de Futurilla.

Butonul X poate fi: apăsat; trimiteți informațiile pe care le-a fost presat; a fi eliberat; și trimite informații care au fost eliberate. Nu are nicio idee că există alte butoane chiar lângă ea și nici nu-i pasă.

Controlerul în sine este o componentă, compusă din alte componente (toate butoanele, joystick-urile și declanșatoarele), deoarece poate trimite date la orice este conectat, dar nu le pasă ce este acest obiect (Xbox, PC, unele Arduino creație, sau orice altceva). Nici butonul X, nici controlerul propriu-zis, nu trebuie să știe ce joc jucați, deoarece își va face treaba, indiferent de receptorul informațiilor sale. 

Funcția controlerului este o stradă cu sens unic, iar sarcina sa nu se va schimba din cauza conexiunii. Acest lucru o face o componentă de succes, atât pentru că își poate face treaba ca un dispozitiv autonom, dar și pentru că își poate face treaba cu multiplu dispozitive.


Cum și de ce Componentele unitate favorizează?

Unitatea a fost construită cu componente în minte și arată. Unul dintre aspectele cele mai valoroase și distinctive ale Unității este că este un program foarte vizual. Am lucrat în dezvoltarea de jocuri de ani de zile și, în afară de zilele mele foarte devreme în Flash IDE, am lucrat mai ales cu foi de sprite PNG și cu un editor de cod, cum ar fi FlashDevelop, care nu este vizibil la toate.

Unitatea este exact opusul. Unitatea vă permite să vedeți tot ce lucrați și în timp real. Aceasta înseamnă că puteți să vă testați proiectul, să vă vedeți proiectul care rulează într-o fereastră separată, să faceți modificări în obiectele de cod sau obiecte de joc și să vedeți acele editări reflectate în direct. Cantitatea de putere pe care acest sistem o oferă unui dezvoltator este imensă și, în opinia mea, este acum un aspect esențial al dezvoltării moderne a jocurilor. Toate acestea sunt posibile prin arhitectura bazată pe componente a Unity.

Inspectorul

În cazul în care nu sunteți familiarizat cu Unitatea, voi explica inspectorul. Acesta este un panou din Unitate care vă arată toate proprietățile unui obiect de joc. Dacă faceți clic pe player-ul dvs. din lume (fie la run-time, fie înainte), veți putea vedea totul despre obiectul respectiv.

Dacă jucătorul dvs. avatar are șase componente pe ele, fiecare va fi listat într-o filă separată, iar fiecare variabilă publică va fi disponibilă pentru a vă vedea și a modifica. Dacă avatarul dvs. de jucător are un inventar, veți vedea nu numai că are un inventar, veți putea, de asemenea, să vedeți elementele din acel inventar și ce index din listă sau din matrice ocupă fiecare element particular. Dacă ridicați un element nou în joc în timp ce testați, veți vedea că acesta este adăugat la inventar live. Puteți chiar adăuga sau elimina elemente din acel inventar, ceea ce vă va permite să testați rapid articole noi, pe care le puteți crea chiar în timp ce jocul rulează.

Inspectorul unității.

În timp ce editarea în direct este puternic, nu se bazează exact pe utilizarea componentelor. Ați putea schimba un scenariu și puteți vedea acele editări reflectate în direct, dar acest lucru este limitat în comparație cu ceea ce vă permite să faceți.

Luați în considerare un shooter spațiu vertical. Când vă testați proiectul în cele mai multe alte medii, veți vedea cum jocul dvs. se joacă, faceți note, apoi reveniți în cod și faceți lucruri, doar pentru a compila din nou proiectul și pentru a testa acele puncte. Dacă aveți o setare live, puteți modifica codul în zbor și puteți vedea acele modificări în timp ce jucați, ceea ce este chiar mai bun. Acestea fiind spuse, dacă nu utilizați componente, va trebui să schimbați o mulțime de coduri pentru a vedea orice efecte majore, care necesită timp, iar acest lucru înfrânge mai degrabă scopul editării în direct.

Dacă lucrați cu componente, puteți adăuga componente noi în două secunde. Puteți schimba armele navei dvs. pentru armele pe care un șef le folosește (presupunând că ați programat componentele dvs. să funcționeze singure, cum ar trebui să facă componentele bune), puteți schimba sistemul dvs. de sănătate cu cinci lovituri la acel scut de reîncărcare cum ar fi Halo programate pentru un alt joc. puteți adăuga o serie de vrăji la unul dintre personajele dvs. și totul în câteva secunde.

Nu este nevoie să schimbați niciun cod, nu trebuie să recompilați, pur și simplu trageți și plasați, sau selectați componenta dorită dintr-o listă derulantă și este adăugată. Acest tip de putere este de neprețuit pentru echilibrarea jocurilor și economisește cantități extraordinare de timp.


Trecerea la gândirea bazată pe componente

Cea mai grea parte din lucrul cu componentele este să învățați cum să vă structurați proiectele când le folosiți. Pentru majoritatea programatorilor, acest lucru va însemna probabil că veți crea mai multe scenarii, fiecare făcând sarcini mai mici și mai specifice.

Modul în care comunicați între scenarii este de asemenea un obstacol decent, deoarece veți avea mult mai multe piese și mai puține clase uriașe, unde fiecare obiect cunoaște fiecare obiect. Există în mod clar modalități în jurul valorii de acest lucru, cum ar fi variabilele statice pentru componentele principale ale jocului dvs. (jucători, scor etc.), dar rareori funcționează pentru tot (și nu este recomandat) și există metode avansate pentru a structura corespunzător componentele , și să rămână decuplate.

Din fericire, deoarece Unitatea a fost construită cu componente în minte, ea are o serie de funcții încorporate care ne ajută să realizăm acest lucru. Există funcții pentru a obține referințe la o anumită componentă, pentru a verifica toate obiectele care trebuie văzute care conțin o componentă specifică etc. Cu aceste funcții diferite, puteți recupera cu ușurință informațiile necesare pentru a crea acea stradă magică a cunoașterii, în cazul în care componentele pot comunică cu obiectele pe care le afectează, însă componenta în sine nu are nicio idee despre exact ce obiect este. Combinați acest lucru cu utilizarea interfețelor și aveți suficientă putere de programare pentru a lua orice abordare a problemei, simplă sau complexă.

Exemplu: Tipuri de inamici

Într-un sistem de moștenire OOP, ai putea avea o bază Dusman clasa care conținea toate funcțiile pe care majoritatea dușmanilor v-ar folosi, și apoi ați putea să le extindeți pentru a adăuga funcționalități specifice.

Dacă ați implementat vreodată un astfel de sistem, știți că între baza dvs. Dusman clasa, și probabil baza ta GameObject (sau echivalent), veți ajunge cu o mulțime de aglomerări inutile de la a avea variabile și funcții pe care unele clase le au nevoie, dar mulți nu. interfeţe pot ajuta cu acest lucru, dar nu sunt întotdeauna soluția.

Acum, să aruncăm o privire la aceeași configurație, dar să ne gândim la componente. Încă mai aveți diverși dușmani, dintre care toate au o mulțime de funcționalități comune, dar fiecare are caracteristici unice.

Primul pas este să rupă toate funcționalitățile în bucăți. S-ar putea crede asta având sănătate și moarte fac parte din același sistem, dar chiar și acest exemplu poate fi împărțit într-o componentă a sistemului de sănătate și o componentă a sistemului de deces. Acest lucru se datorează faptului că sănătatea ta este sănătatea ta și nimic mai mult. Când ajunge la zero, nu este de până la sistemul de sănătate să decidă ce se întâmplă în continuare, este doar la sistemul de sănătate să știe că este, de fapt, la zero. Alte sisteme, un astfel de sistem de deces, pot citi aceste informații și apoi pot alege să facă cum se cuvine.

Poate că sistemul de deces va da naștere unui nou inamic (gândiți-vă la un dușman mare care se rupe în biți); poate că va scădea puterea; poate că va adăuga un efect de explozie pe ecran. Indiferent de ceea ce se întâmplă, sistemul de sănătate nu face parte din acest lucru și astfel facem componente curate și utile.

Când ne gândim la mișcare, am putea crede că orice mișcare trebuie să fie într-un singur scenariu. Dar unii dușmani în unele jocuri nu pot merge; ei pot doar sari. Unii dușmani pot merge, dar nu pot sări. Gândirea la aceste lucruri este modul în care observăm unde pot fi componentele și ar trebui să existe. Când vine vorba de mobilitate, am putea separa saltul de mersul pe jos sau de funcționare, zborul separat, și așa mai departe, făcând astfel un cod mai curat și o versatilitate mai mare.

Componentele fac codul nostru mai neted (nu există variabile și funcții inutile), dar ele fac și procesul de creare a dușmanilor mult mai flexibil și mai plăcut. Cu fiecare funcție a inamicului stabilită ca o componentă, putem trage și plasa aspecte ale inamicilor și vedem cum se comportă - și chiar în timp real, dacă folosim Unitatea.

Să presupunem că toate caracteristicile următoare sunt deja programate. În timpul procesului nostru de creație inamic, am putea crea trei dușmani goi, care sunt doar prefabricate goale în Unitate. Apoi, putem trage un sistem de sănătate, un sistem de scăpare a elementelor și un sistem de deces, deoarece știm că toți dușmanii noștri, indiferent de diferențe, vor avea sănătate, vor muri și vor cădea un element. De fapt, putem selecta toate cele trei prefabricate simultan, apoi glisați și fixați aceste componente în panoul Inspector și actualizați toate cele trei în același timp.

Apoi, știm că un inamic va fi capabil să zboare, așa că alegem un singur dușman și trageți unul zbor componentă pe ea. Altă persoană poate să arate o țintă în joc și să tragă cu ea, așa că aruncăm o lovitură foc la țintă component script. Al treilea poate arunca o barieră care blochează toate atacurile pe o perioadă scurtă de timp, așa că aruncăm barieră component.

Acum avem trei dușmani unici, toți împărțind anumite componente, dar toți având și componente care se aplică doar acestora. Partea plăcută este aceea de a face acești dușmani simpli și experimentarea cu noi variații este la fel de ușoară ca tragerea și abandonarea. Vrei un dușman zburător, cu o barieră, care să poată viza un inamic și să tragă în el? Trageți toate componentele de mai sus într-un singur inamic, și tocmai ați făcut asta!


Concluzie

Gândirea cu componentele poate să nu fie ușoară, dar cu siguranță are avantajele sale. Veți continua să utilizați atât componentele, cât și moștenirea în programarea viitoare, dar este extrem de important să extindeți multitudinea de modalități de abordare a aceleiași probleme prin vizionarea diferitelor perspective.

Când vine vorba de unitate, puteți folosi oricare dintre metodele pe care le preferați, dar componentele sunt cu siguranță favorizate și pur și simplu nu are sens să luptați împotriva unui astfel de flux de lucru uimitor. Învățarea Unității și schimbarea modului meu de a gândi să lucrez cu componente a fost un obstacol moderat dificil de depășit, dar acum că sunt aici, nu mă văd întorcându-mă în curând.