Vodnik za začetnike za razvoj iger v enotnosti

Unity je odlično orodje za izdelavo prototipov vse od iger do interaktivnih vizualizacij. V tem članku preiščemo vse, kar morate vedeti, da začnete uporabljati Unity.

Najprej malo o meni: sem razvijalec hobiistične enotnosti, 3d modelar in grafični oblikovalec, ki že več kot 5 let sodelujem z Unity in Blender. Zdaj sem študent finančne matematike na University College Dublin in se občasno ukvarjam s samostojnim grafičnim oblikovanjem, izdelavo spletnih prototipov in izdelavo prototipov iger.

Uvod

Ta članek je namenjen vsem, ki še nikoli niso uporabljali Unity, vendar imajo že nekaj izkušenj s programiranjem ali spletnim oblikovanjem / razvojem. Do konca tega članka bi morali imeti dober splošen pregled nad motorjem ter vse potrebne funkcije in kodo za začetek izdelave osnovne igre.

Zakaj enotnost?

Če želite izdelovati igre

Ko gre za razvoj Indie Game, je res zelo malo možnosti. Tri glavne izbire, če želite graditi igre, so Unreal, Unity ali GameMaker.

Unity je verjetno najmanj zaupljiv med tremi platformami. Omogoča vam zelo surov izdelek, vendar je zelo prilagodljiv, dobro dokumentiran in zelo razširljiv za izdelavo skoraj vseh zvrsti iger, ki si jih omislite.

Obstaja veliko zelo uspešnih iger, kot so Escape from Tarkov (FPS), Monument Valley (Puzzler) in This War of Mine (Strategy / Survival), vse zgrajene v Unity.

V resnici motor, na katerem gradite svojo prvo igro, verjetno ni kritičen, zato je moj nasvet le, da ga izberete in se z njim odločite.

Če želite prototipirati uporabniške izkušnje

Ker je enotnost le motor s kopico fizike, animacije in 3D-upodabljanja v realnem času, je tudi odličen prostor za izdelavo polnopravnih interaktivnih prototipov za študije UX.

Unity ima popolno podporo za VR in AR, zato je lahko odlično orodje za raziskovanje arhitekture, avtomatizacije in simulacij s strankami.

Oddelki tega članka

  • Zakaj enotnost?
  • Okno urejevalnika Unity
  • Predmeti igre Unity
  • Unity vgrajene komponente
  • Ustvarjanje komponent po meri
  • Struktura mono vedenja
  • Manipuliranje z GameObjects
  • Raycasting
  • Zaznavanje trkov
  • Napredne funkcije
  • Nasveti za novince
  • Lepi viri in skupnosti
  • Zaključek

Okno urejevalnika Unity

Okno urejevalnika je razdeljeno na nekaj odsekov. To bomo pokrili zelo na kratko, saj se bomo nanj nenehno sklicevali v celotnem članku. Če že poznate to, samo preskočite!

Scene View: Omogoča namestitev in premikanje GameObjects v Scene Game View: Predogled, kako bo predvajalnik videl prizor iz kamere Inspector: Navedite podrobnosti o izbranem GameObject v sceni. Sredstva / projekt: Tu so shranjeni vsi montažni deli, teksture, modeli, skripti itd. Hierarhija: omogoča gnezdenje in strukturiranje GameObjects znotraj scene

Zdaj smo dobro začeli!

Predmeti igre Unity

Kaj so GameObjects

GameObjects so osrednji gradnik vsega v mehanizmu iger Unity. Ime ga skorajda odda:

Vse, kar postavite v prizor v Unity, mora biti zavito v "predmet igre".

Če imate ozadje spletnega oblikovanja, lahko o GameObjects razmišljate kot o podobnih elementih! Zelo dolgočasni zabojniki, vendar so zelo razširljivi za ustvarjanje zapletene funkcionalnosti ali vizualnih elementov.

Dobesedno vse, od učinkov delcev, kamer, predvajalnikov, elementov uporabniškega vmesnika ... (seznam se nadaljuje) je GameObject.

Ustvarjanje hierarhije

Tako kot pri spletnem razvoju je tudi GameObject vsebnik. Tako kot gnezdiš za ustvarjanje raznolikih in zaželenih postavitev ali abstrakcij, boš morda želel storiti enako z igrami.

Logika gnezdenja iger je skoraj enaka razvoju spletnih strani, dal bom nekaj primerov ...

Nered in učinkovitost

Spletna analogija: Imate veliko podobnih elementov, ki se lahko dinamično generirajo sproti kot odziv na interakcijo uporabnika in jih želijo urejati. Unity Translation: Ko zgradite klon Minecrafta in imate na sceni veliko blokov, morate zaradi prilagajanja dodati in odstraniti "koščke" blokov s scene. Torej je smiselno, da so parentirani za prazen GameObject za vsak kos, saj z brisanjem nadrejenega dela odstranite vse podrejene bloke.

Pozicioniranje

Spletna analogija: Želite ohraniti položaj vsebine, ki je "relativno" glede na vsebnik in ne na spletno stran. Unity Translation: Ustvarili ste kup pomožnih brezpilotnih letal, ki lebdijo okoli predvajalnika. Resnično ne bi raje pisali kode, da bi jim rekli, naj se lovijo za igralcem, zato jih namesto tega ustvarite kot podrejene predmete igralčeve igre.

Unity vgrajene komponente

Model igralne komponente

GameObjects sami po sebi so dokaj neuporabni - kot smo videli, so v bistvu le posode. Da bi jim dodali funkcionalnost, moramo dodati komponente, ki so v bistvu skripti, napisani v jeziku C # ali Javascript.

Unity deluje na model igralne komponente, preprosto GameObjects so igralci, komponente pa vaši skripti.

Če ste že napisali katero koli spletno aplikacijo, boste že seznanjeni z idejo o ustvarjanju majhnih komponent za večkratno uporabo, kot so gumbi, elementi obrazcev, prilagodljive postavitve z različnimi direktivami in prilagodljivimi lastnostmi. Nato te majhne komponente sestavite v večje spletne strani.

Velika prednost tega pristopa je raven ponovne uporabnosti in jasno opredeljeni komunikacijski kanali med elementi. Podobno pri razvoju iger želimo zmanjšati tveganje za neželene stranske učinke. Če niste previdni, majhne napake uidejo izpod nadzora in jih je zelo težko odpraviti. Tako je ustvarjanje majhnih, robustnih in uporabnih komponent ključnega pomena.

Ključne vgrajene komponente

Mislim, da je čas za nekaj primerov vgrajenih komponent, ki jih ponuja motor Unity Games.

  • MeshFilter: Omogoča dodelitev materialov 3D mrežam GameObject
  • MeshRender: Omogoča dodelitev materialov 3D mreži
  • [Polje | Mesh] Collider: Omogoča zaznavanje GameObject med trki
  • Rigidbody: Omogoča realistično fizikalno simulacijo, da deluje na GameObjects s ​​3D očesi in bo sprožil dogodke zaznavanja na drsnikih
  • Luč: osvetli dele vašega prizora
  • Kamera: Določi okno za predvajanje predvajalnika, ki bo priloženo predmetu GameObject
  • Različne komponente uporabniškega vmesnika za prikaz grafičnih uporabniških vmesnikov

Naložb je še več, vendar so to glavne, s katerimi se boste morali seznaniti. Eden nasvetov je, da lahko do vseh dokumentov zanje dostopate prek priročnika enotnosti in sklicnega sklica brez povezave, kjer koli že ste:

Ustvarjanje komponent po meri

Vgrajene komponente nadzorujejo predvsem fiziko in vizualne elemente, toda za resnično igranje boste morali sprejeti uporabniški vnos in manipulirati s temi standardnimi komponentami, pa tudi s samimi GameObjects.

Če želite začeti ustvarjati komponente, pojdite v želeni GameObject> Dodaj komponento> v iskalno vrstico vnesite ime nove komponente> nov skript (c #).

Kot splošno priporočilo odsvetujem uporabo Javascripta v Unity. Niso ga posodabljali z vsemi odličnimi stvarmi, ki jih je dobil ES6, in večina naprednejših stvari se opira na stvari C #, prenesene v Javascript ... Po mojih izkušnjah to preprosto postane eno ogromno delo.

Struktura mono vedenja

Ključne funkcije

Vse komponente podedujejo iz razreda MonoBehaviour. Vključuje več standardnih metod, kar je najpomembneje:

  • void Start (), ki se pokliče vsakič, ko je v sceni primerek predmeta, ki vsebuje skript. To je koristno kadar koli želimo izvesti neko kodo za inicializacijo, npr. nastavite opremo igralca, potem ko se drsti na tekmo.
  • void Update (), ki se imenuje vsak okvir. Tu gre večina kode, ki vključuje uporabniški vnos, in posodablja različne lastnosti, kot je gibanje predvajalnika v sceni.

Inšpektorske spremenljivke

Pogosto želimo sestavne dele narediti čim bolj prilagodljive. Na primer, lahko ima vse orožje drugačno škodo, hitrost streljanja, has_sight itd. Medtem ko je vse orožje v bistvu isto, bomo morda želeli hitro ustvariti različne različice z urejevalnikom enotnosti.

Drug primer, ko bi to morda želeli storiti, je pri ustvarjanju komponente uporabniškega vmesnika, ki sledi gibanju uporabniške miške in postavi kazalko v prikazno polje. Tu bi morda želeli nadzorovati občutljivost kazalke na premike (če je uporabnik uporabljal krmilno palčko ali igralno ploščico v primerjavi z računalniško miško). Zato bi bilo smiselno, da bi te spremenljivke enostavno spreminjali tako v načinu za urejanje kot tudi eksperimentirali z njimi med izvajanjem.

To lahko storimo enostavno, če jih preprosto razglasimo kot javne spremenljivke v telesu komponente.

Sprejem uporabnikovega vnosa

Seveda želimo, da se naša igra odziva na uporabniški vnos. Najpogostejši načini za to so naslednji postopki v funkciji Update () komponente (ali kjer koli drugje):

  • Input.GetKey (KeyCode.W) Vrne tipko True W držite pritisnjeno
  • Input.GetKeyDown (KeyCode.W) Vrne True, ko prvič pritisnete tipko W
  • Input.GetAxis (“Vertical”), Input.GetAxis (“Horizontal”) Vrne med -1,1 premikanja vnosa miške

Manipuliranje z GameObjects

Ko dobimo uporabniški vnos, želimo, da se GameObjects znotraj naše scene odzovejo. Upoštevamo lahko več vrst odgovorov:

  • Prevajanje, vrtenje, lestvica
  • Ustvarite nove GameObjects
  • Pošiljanje sporočil obstoječim GameObjects / komponentam

Preobrazbe

Vsi GameObjects imajo lastnost preoblikovanja, ki omogoča izvajanje različnih uporabnih manipulacij na trenutnem predmetu igre.

Zgornje metode so dokaj samoumevne, upoštevajte le, da za sklicevanje na GameObject, ki je lastnik tega posebnega primerka komponente, uporabljamo male črke gameObject .

Na splošno je dobra praksa, če namesto globalnega položaja / zasuka predmeta uporabimo lokalno [Position, Rotation] . To običajno olajša premikanje predmetov na smiseln način, saj bo lokalna vesoljska os usmerjena in centrirana na nadrejeni predmet in ne na svetovni izvor in smeri x, y, z.

Če želite pretvoriti med lokalnim in svetovnim prostorom (kar se pogosto zgodi), lahko uporabite naslednje:

Kot si lahko predstavljate, je za tem nekaj precej preproste linearne algebre, na katero namiguje 'Inverse' v imenu metode.

Ustvarjanje novih GameObjects

Ker so GameObjects v bistvu vse na vaši sceni, jih boste morda želeli sproti ustvarjati. Na primer, če ima vaš predvajalnik nekakšen izstrelitev izstrelkov, boste morda želeli, da bi lahko sproti ustvarili izstrelke, ki imajo lastno inkapsulirano logiko za let, nanašanje škode itd.

Najprej moramo predstaviti pojem montažnega materiala . Te lahko ustvarimo tako, da kateri koli GameObject v hierarhiji prizora povlečemo v mapo sredstev.

To v bistvu shrani predlogo predmeta, ki smo ga pravkar imeli na naši sceni, z enakimi konfiguracijami.

Ko imamo te prefab komponente, jih lahko dodelimo inšpekcijskim spremenljivkam (kot smo že govorili prej) na kateri koli komponenti v sceni, tako da lahko kadar koli ustvarimo nove GameObjects, kot jih določa prefab.

Nato lahko izvedemo "instanciranje" montažnega dela in z njim manipuliramo na želeno mesto v sceni ter vzpostavimo potrebne nadrejene odnose.

Dostop do drugih GameObjektov in komponent

Pogosto moramo komunicirati z drugimi GameObjects, kot tudi z njimi povezanimi komponentami. Ko se sklicujete na predmet igre, je to precej preprosto.

ComponentName comp = some_game_object.GetComponent ();

Po tem lahko dostopate do katere koli javne metode / spremenljivke komponente za manipulacijo GameObject. To je neposreden del, vendar je dejansko pridobivanje sklica na GameObject mogoče na več načinov ...

Dostop prek spremenljivke inšpektorja

To je najbolj enostavno. Preprosto ustvarite javno spremenljivko za GameObject, kot smo že pokazali s prefabami, in jo ročno povlecite in spustite na komponento prek inšpektorja. Nato odprite spremenljivko, kot je navedeno zgoraj.

Dostop prek označevanja

Preko inšpektorja lahko označimo GameObjects ali prefabs in nato s pomočjo funkcij find game predmeta poiščemo sklice nanje.

To preprosto storite, kot je opisano spodaj.

GameObject some_game_object = GameObject.FindGameObjectWithTag (“Opeka”);

Dostop prek preoblikovanja

Če želimo dostopati do komponent v kakšnem nadrejenem objektu, lahko to enostavno naredimo s pomočjo atributa transform.

ComponentName comp = gameObject.transform.parent.GetComponent ();

Dostop prek SendMessage

Če želimo poslati sporočilo številnim drugim komponentam ali če želimo poslati objekt, ki je daleč navzgor ugnezdena hierarhija, lahko uporabimo funkcije za pošiljanje sporočil, ki sprejmejo ime funkcije, ki ji sledijo argumenti.

gameObject.SendMessage (“MethodName”, parametri); // Oddaja messagegameObject.SendMessageUpwards (“MethodName”, params); // Prejemajo ga samo zgoraj ugnezdene komponente.

Raycasting

Za to ste morda že slišali, ko ljudje primerjajo igre FPS, ki temeljijo na "fiziki" ali "temeljijo na žarkih". Raycasting je v bistvu kot laserski kazalec, ki v stiku z "trkalnikom" ali "trdim telesom" vrne "zadetek" in posreduje podrobnosti predmeta.

Obstajata dva primera, ko je to priročno (verjetno jih je še več):

  1. Če ste za igro načrtovali orožni sistem, bi lahko uporabili raycasting za zaznavanje zadetkov in celo prilagodili dolžino žarka, tako da so predmeti v bližini »zadeli« le na kratkih razdaljah
  2. Ustvari žarek od kazalca miške do točke v 3D prostoru, tj. Če želiš, da lahko uporabnik izbere enote z miško v strateški igri.

Kot lahko vidite, je koda za to nekoliko bolj vključena. Ključno, kar je treba razumeti, je, da za oddajanje žarka tja, kamor miška kaže v 3D prostoru, potrebujemo preoblikovanje ScreenPointToRay. Razlog za to je, da kamera upodobi 3d prostor kot 2d prikaz na zaslonu prenosnega računalnika, zato seveda obstaja projekcija za prenos nazaj v 3d.

Zaznavanje trkov

Prej smo že omenili komponente Collider in Rigidbody, ki jih je mogoče dodati predmetu. Pravilo za trke je, da mora imeti en predmet v trku togo telo, drugi pa trk (ali pa imata oba sestavna dela). Upoštevajte, da bodo žarki pri uporabi oddajanja žarkov vplivali samo na predmete s pritrjenimi komponentami trkalnika.

Ko nastavite katero koli komponento po meri, ki je pritrjena na objekt, lahko za odziv na trke uporabimo metode OnCollisionEnter, OnCollisionStay in OnCollisionExit. Ko dobimo informacije o trkih, lahko GameObject odgovorno uporabimo in uporabljeno, kar smo se prej naučili, uporabimo tudi za interakcijo s komponentami, ki so nanj pritrjene.

Upoštevati je treba, da toga telesa zagotavljajo fiziko, kot je gravitacija predmetov, zato, če želite, da je ta izklopljena, morate preveriti, ali je is_kinematic vklopljen.

Napredne funkcije

Zdaj ne bomo šli v nič od tega, morda pa v prihodnjem članku - samo zato, da vas ozavestimo, da obstajajo.

Ustvarjanje GUI-jev

Unity ima polnopravni uporabniški vmesnik za postavitev grafičnega uporabniškega vmesnika za vašo igro. Na splošno te komponente delujejo precej podobno kot ostali motorji.

Razširitev urejevalnika Unity

Unity vam omogoča, da svojim inšpektorjem dodate gumbe po meri, tako da lahko v načinu urejanja vplivate na svet. Na primer za pomoč pri gradnji sveta lahko razvijete okno po meri za gradnjo modularnih hiš.

Animacija

Unity ima grafični sistem za animacijo, ki vam omogoča mešanje in nadzor animacij na različnih predmetih, kot so igralci, ki izvajajo kostni sistem za animacijo.

Materiali in PBR

Unity poganja fizično zasnovan mehanizem za upodabljanje, ki omogoča sprotno osvetlitev in realistične materiale. Resničnost je, da se boste morali najprej naučiti 3d modeliranja ali pa uporabiti modele, ki jih je naredil in optimiziral nekdo drug, preden se lotite tega, da naredite stvari, ki so dejansko videti dobro.

Nasveti za novince

Če nameravate napisati svojo prvo igro, ne podcenjujte zapletenosti in časa, potrebnega za pisanje tudi najbolj nepomembnih iger. Ne pozabite, da v večini iger, ki izhajajo v Steamu, ekipe delajo na njih že vrsto let!

Izberite preprost koncept in ga razdelite na majhne dosegljive mejnike. Zelo priporočljivo je, da svojo igro razdelite na čim manjše neodvisne komponente, saj je veliko manj verjetnosti, da boste naleteli na napake, če komponente ostanejo enostavne in ne monolitnih blokov kode.

Preden greste in napišete katero koli kodo za kateri koli del igre, pojdite in raziščite, kaj je že kdo storil, da bi rešili isti problem - verjetno je, da bodo imeli veliko bolj gladko rešitev.

Lepi viri in skupnosti

Oblikovanje iger ima eno najboljših skupnosti od vseh, v panogi pa je ogromno visoko usposobljenih profesionalcev, ki vsebino dajo brezplačno ali za nič. To je področje, ki zahteva 3d modelarje, koncept umetnike, oblikovalce iger, programerje itd. Spodaj sem povezal nekaj odličnih splošnih virov, ki sem jih našel za vsako od teh polj:

Concept Art

  • Šola za oblikovanje Feng Zhu (več kot 90 ur dolge vaje o konceptu)
  • Tyler Edlin Art (odlična umetniška skupnost BST s povratnimi informacijami profesionalcev o mesečnih izzivih)
  • Art Cafe (Intervjuji in delavnice s slavnimi konceptualnimi umetniki)
  • Trent Kaniuga (ilustrator in 2D umetnik, ki ustvarja tudi svojo igro)

3D modeliranje

  • CG piškotek (najboljše osnove za oblikovanje mrež v blenderju kdaj, na voljo je še veliko odlične vsebine za blender)
  • Tor Frick (Moderatorji trdih površin in kiparji v blenderju)
  • Gleb Alexandrov (Kratke vadnice za upodabljanje v Blenderju)

Oblikovanje iger

  • DoubleFine Amnesia Fortnight (GameDevs, ki naredijo dvotedenski hackathon in posnamejo celoten postopek oblikovanja)
  • Komplet orodij GameMakers (preučuje načela oblikovanja iger)

Programiranje

  • Ročno izdelan junak (pisanje igre in motorja iz nič v C)
  • Jonathan Blow (Indie dev, ki prenaša svoj razvoj iger)
  • Brackeys (vaje Nice Unity)

Zaključek

Upam, da vam je bila ta vadnica všeč! Delam nekaj grafičnega oblikovanja, pa tudi prototipe iger in uporabniškega vmesnika, zato si oglejte moj portfelj ! Jaz sem tudi na povezani v .

Portfelj| LinkedIn