Mängude arendamise algajate juhend ühtsuses

Unity on suurepärane vahend prototüüpide loomiseks alates mängudest kuni interaktiivsete visualiseerimisteni. Selles artiklis tutvustame kõike, mida peate teadma Unity kasutamise alustamiseks.

Esiteks, natuke minust: olen harrastajate ühtsuse arendaja, 3D-modelleerija ja graafiline disainer, kes on Unity ja Blenderiga töötanud üle 5 aasta. Olen nüüd finantsmatemaatika üliõpilane Dublini ülikooli kolledžis ja tegelen aeg-ajalt vabakutselise graafilise disaini, veebi- ja mänguprototüüpidega.

Sissejuhatus

See artikkel on suunatud kõigile, kes pole kunagi varem Unityd kasutanud, kuid kellel on varasem kogemus programmeerimise või veebidisaini / arenduse alal. Selle artikli lõpuks peaks teil olema hea üldine ülevaade nii mootorist kui ka kõikidest vajalikest funktsioonidest ja koodist, et alustada põhimängu tegemist.

Miks just ühtsus?

Kui soovite mänge teha

Indie mängu arendamisel on tõesti väga vähe võimalusi. Kolm peamist valikut, kui soovite mänge ehitada, on Unreal, Unity või GameMaker.

Ühtsus on ilmselt 3 platvormi hulgas kõige vähem arvamust avaldanud. See annab teile karbist väga toore toote, kuid on väga paindlik, hästi dokumenteeritud ja väga laiendatav, et ehitada peaaegu iga žanri mängu, mida võite mõelda.

Unity's on ehitatud palju üliedukaid mänge, nagu Escape from Tarkov (FPS), Monument Valley (Puzzler) ja This War of Mine (Strategy / Survival).

Tegelikkuses pole mootor, millele oma esimese mängu ehitate, tõenäoliselt kriitiline, nii et minu nõuanne on lihtsalt valida üks ja minna sellega kaasa.

Kui soovite prototüüpida kasutajakogemusi

Kuna ühtsus on lihtsalt hunniku füüsika, animatsiooni ja reaalajas 3d-renderduse mootor, on see ka suurepärane ruum UX-uuringute jaoks täieõiguslike interaktiivsete prototüüpide valmistamiseks.

Unity toetab VR-i ja AR-i täielikult ning võib seega olla suurepärane vahend klientidega arhitektuuri, automaatika ja simulatsioonide uurimiseks.

Selle artikli jaotised

  • Miks just ühtsus?
  • Unity Editori aken
  • Ühtsuse mängu objektid
  • Unity sisseehitatud komponendid
  • Kohandatud komponentide loomine
  • Mono-käitumise struktuur
  • Mängobjektidega manipuleerimine
  • Kiirteate edastamine
  • Kokkupõrke tuvastamine
  • Täpsemad funktsioonid
  • Nõuanded uutele tulijatele
  • Toredad ressursid ja kogukonnad
  • Järeldus

Ühtsuse redaktori aken

Redaktori aken on jagatud paariks osaks. Käsitleme seda väga lühidalt, kuna viitame sellele kogu artiklis pidevalt. Kui olete sellega tuttav, jätke lihtsalt mööda!

Stseenivaade : võimaldab GameObjektide paigutamist ja liikumist stseenimängu vaates: eelvaade, kuidas mängija kaamerainspektorist stseeni näeb : esitage stseenis valitud GameObjecti üksikasjad. Varad / Projekt: kõik eelpaneelid, tekstuurid, mudelid, skriptid jms on siin salvestatud. Hierarhia: lubab GameObjektide pesitsemise ja struktureerimise stseenis

Nüüd on meil hea alustada!

Ühtsuse mängu objektid

Mis on GameObjects

GameObjects on Unity mängumootori kõige põhiline ehituskivi. Nimi annab selle peaaegu ära:

Kõik, mis asetate Unity's stseeni sisse, tuleb pakkida „mänguobjekti”.

Kui teil on veebidisaini taust, võite mõelda, et GameObjects sarnaneb elementidega! Äärmiselt igavad konteinerid, kuid on keeruka funktsionaalsuse või visuaalsuse loomiseks väga laiendatavad.

Sõna otseses mõttes kõik, alates osakeste efektidest, kaameratest, mängijatest, kasutajaliidese elementidest… (loetelu jätkub), on GameObject.

Hierarhia loomine

Nagu veebiarenduses, on ka GameObject konteiner. Nii nagu te pesitsete mitmekesiste ja soovitavate paigutuste või abstraktsioonide loomiseks, võiksite sama teha ka mänguobjektidega.

Pesitsevate mänguobjektide loogika on paljuski sama mis veebiarendus. Toon mõned näited ...

Segadus ja tõhusus

Veebianaloogia: teil on palju sarnaseid elemente, mida võidakse kasutajate interaktsioonide põhjal dünaamiliselt lennult genereerida ja soovite neid korras hoida. Ühtsuse tõlge: kui ehitate Minecrafti klooni ja teil on stseenis palju plokke, peate jõudlusega seotud põhjustel stseenilt plokkide tükid lisama ja eemaldama. Seega on mõistlik lasta neil iga tüki jaoks tühjaks tõmmata GameObject, kuna tükikese vanema kustutamine eemaldab kõik lasteplokid.

Positsioneerimine

Veebianaloogia: soovite säilitada sisus oleva sisu positsiooni konteineri ja mitte veebilehe suhtes. Unity Translation: olete loonud hulga abidroone, mis hõljuvad mängija ümber. Te tõesti ei kirjutaks pigem koodi, et käskida neil mängijat taga ajada, seega kiirendate nad mängijamängu lastena.

Unity sisseehitatud komponendid

Näitleja komponendi mudel

GameObjects üksi on üsna kasutud - nagu me nägime, on need üsna lihtsalt konteinerid. Neile funktsionaalsuse lisamiseks peame lisama komponendid, mis on põhiliselt skriptid, mis on kirjutatud kas C # või Javascript.

Ühtsus töötab näitlejakomponendi mudeli järgi, lihtsalt mänguesemed on näitlejad ja komponendid on teie skriptid.

Kui olete enne mõnda veebirakendust kirjutanud, olete tuttav väikeste korduvkasutatavate komponentide loomise ideega, nagu nupud, vormielemendid, paindlikud paigutused, millel on erinevad direktiivid ja kohandatavad atribuudid. Seejärel koondage need väikesed komponendid suuremateks veebilehtedeks.

Selle lähenemise suur eelis on korduvkasutatavuse tase ja selgelt määratletud suhtluskanalid elementide vahel. Samamoodi tahame mängude arendamisel minimeerida soovimatute kõrvaltoimete riski. Väikesed vead kipuvad kontrolli alt väljuma, kui te pole ettevaatlik, ja nende silumine on äärmiselt keeruline. Seega on väikeste, vastupidavate ja korduvkasutatavate komponentide loomine kriitilise tähtsusega.

Sisseehitatud võtmekomponendid

Ma arvan, et on aeg mõned näited sisseehitatud komponentidest, mille pakub Unity Games mootor.

  • MeshFilter: võimaldab teil määrata materjale GameObjecti 3D-võrgusilmi
  • MeshRender: võimaldab teil 3D-võrgusilmale materjale määrata
  • [Lahter | Võrgusilma] Collider: võimaldab GameObjecti tuvastada kokkupõrgete ajal
  • Rigidbody: võimaldab realistlikul füüsikalisel simulatsioonil 3D-võrgusilma abil toimida GameObjects'il ja see käivitab kasti põrkajate tuvastamise sündmused
  • Valgus: valgustab teie stseeni osi
  • Kaamera: määrab mängija vaateava, mis lisatakse GameObjectile
  • Erinevad kasutajaliidese lõuendi komponendid GUI-de kuvamiseks

Koormusi on rohkem, kuid need on peamised, mida peate tundma õppima. Üks näpunäide on see, et kõikidele nende dokumentidele pääsete juurde võrguühenduseta käsiraamatu ja skriptide viite kaudu, kus iganes olete

Kohandatud komponentide loomine

Sisseehitatud komponendid kontrollivad peamiselt füüsikat ja visuaale, kuid mängu tõeliseks loomiseks peate nõustuma kasutaja sisendiga ja manipuleerima nii nende standardsete komponentide kui ka GameObjektidega.

Komponentide loomise alustamiseks minge soovitud GameObject> Lisa komponent> tippige otsinguribale uue komponendi nimi> uus skript (c #).

Üldise soovitusena soovitaksin Javascripti Unity'is mitte kasutada. Seda ei ole ajakohastatud kõigi ES6-ga kaasnevate suurepäraste asjadega ja enamik arenenumatest asjadest toetub Javascriptile üle kantud C # kraamile ... Minu kogemuse põhjal saab sellest lihtsalt üks tohutu lahendus.

Mono-käitumise struktuur

Põhifunktsioonid

Kõik komponendid on päritud MonoBehaviour klassist. See sisaldab mitmeid standardmeetodeid, mis kõige tähtsam:

  • void Start (), mida kutsutakse alati, kui stseenis tehakse skripti sisaldav objekt. See on kasulik alati, kui soovime teha mõne initsialiseerimiskoodi, nt. seadke mängija varustus pärast matši kudemist.
  • void Update (), mida nimetatakse igaks kaadriks. Siia läheb suurem osa kasutaja sisendit sisaldavast koodist, värskendades erinevaid omadusi, näiteks mängija liikumist stseenis.

Inspektori muutujad

Sageli soovime komponendid muuta võimalikult paindlikuks. Näiteks võivad kõik relvad olla erineva kahjustuse, tulesageduse, nähtavuse jms poolest. Kuigi kõik relvad on sisuliselt samad asjad, võiksime soovida, et saaksime ühtsuse redaktori kaudu kiiresti luua erinevaid variatsioone.

Teine näide, kus me võiksime seda teha, on kasutajaliidese komponendi loomine, mis jälgib kasutaja hiire liigutusi ja viib kursori vaateporti. Siin võiksime juhtida kursori tundlikkust liikumise suhtes (kui kasutaja kasutas juhtnuppu või mängupulti vs arvutihiirt). Seega oleks mõttekas lasta seda muutujat nii redigeerimisrežiimis hõlpsasti muuta kui ka nendega tööajal katsetada.

Saame seda lihtsalt teha, kuulutades need lihtsalt komponendi kehas avalikeks muutujateks.

Kasutaja sisendi aktsepteerimine

Muidugi tahame, et meie mäng reageeriks kasutaja sisendile. Kõige tavalisemad viisid selleks on komponendi (või muu muu) funktsioonis Update () järgmiste meetodite kasutamine:

  • Input.GetKey (KeyCode.W) Annab vastuseks tõelise W-klahvi
  • Input.GetKeyDown (KeyCode.W) tagastab tõese, kui W-klahvi esimest korda vajutatakse
  • Input.GetAxis („Vertikaalne“), Input.GetAxis („Horisontaalne“) Tagastab -1,1 hiire sisendi liikumise vahel

Mängobjektidega manipuleerimine

Kui kasutaja sisend on olemas, tahame, et GameObjects meie stseenis reageeriks. Võime kaaluda mitut tüüpi vastuseid:

  • Tõlkimine, pööramine, skaala
  • Looge uued GameObjects
  • Sõnumite saatmine olemasolevatele GameObjects / komponentidele

Teisendused

Kõigil GameObjects'itel on omadus transformeerida, mis võimaldab teha erinevaid kasulikke manipuleerimisi praeguse mänguobjektiga.

Eespool toodud meetodid on üsna iseenesestmõistetavad, lihtsalt pange tähele, et me kasutame väikseid tähti gameObject, et viidata GameObjectile, kellele kuulub see komponent.

Üldiselt on hea tava kasutada objekti [Positsioon, Pööre] asemel objekti globaalset asendit / pööret. See hõlbustab tavaliselt objektide liikumist mõistlikul viisil, kuna lokaalne kosmosetelg on orienteeritud ja keskendatud emaobjektile, mitte maailma alguspunktile ja x, y, z suundadele.

Kui peate konverteerima kohaliku ja maailmaruumi vahel (mis sageli nii on), võite kasutada järgmist:

Nagu võite ette kujutada, on selle taga meetodi nimes oleva "Pööratud" vihjatud üsna lihtne lineaarne algebra.

Uute GameObjektide loomine

Kuna GameObjects on teie stseenis põhimõtteliselt kõik, võiksite neid hõlpsalt luua. Näiteks kui teie mängijal on mingisugune mürskude kanderakett, võiksite osata lennult luua mürske, millel on oma kapseldatud loogika lendamiseks, kahju tekitamiseks jne.

Kõigepealt peame tutvustama prefabi mõistet . Saame need lihtsalt luua, lohistades mis tahes stseenihierarhias asuva GameObjecti kausta varad.

See salvestab sisuliselt selle objekti malli, mis meil just stseenis oli, kõigi samade konfiguratsioonidega.

Kui need paneelikomponendid on meil olemas, saame need määrata stseeni mis tahes komponendi inspektorimuutujaile (nagu me varem rääkisime), et saaksime igal ajal luua uusi GameObjektid, nagu prefab täpsustas.

Seejärel saame teha paneeli kohese instantsimise ja manipuleerida selle stseenis soovitud asukohta ning luua vajalikud vanemlikud suhted.

Juurdepääs teistele GameObjektidele ja komponentidele

Sageli peame suhtlema nii teiste GameObjektide kui ka nendega seotud komponentidega. Kui teil on viide mänguobjektile, on see üsna lihtne.

KomponendiNimi comp = some_game_object.GetComponent ();

Pärast seda saate GameObjectiga manipuleerimiseks pääseda juurde mis tahes komponendi avalikule meetodile / muutujale. See on sirgjooneline bitt, kuid tegelikult saab GameObjectile viite hankida mitmel viisil…

Juurdepääs inspektori muutuja kaudu

See on kõige otsesem. Looge lihtsalt GameObjecti jaoks avalik muutuja, nagu oleme varem koos paneelidega näidanud, ja lohistage see käsitsi komponendile inspektori kaudu. Seejärel pöörduge muutuja juurde nagu eespool.

Juurdepääs sildistamise kaudu

Saame inspektori kaudu märkida GameObjects või prefabsid ja seejärel kasutada neile viiteid leidmiseks mänguobjekti leidmise funktsioone.

Seda tehakse lihtsalt nagu allpool.

GameObject some_game_object = GameObject.FindGameObjectWithTag ("tellis");

Juurdepääs teisenduse kaudu

Kui soovime pääseda juurde mõne vanema objekti komponentidele, saame seda hõlpsasti teha atribuudi transform abil.

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

Juurdepääs SendMessage'i kaudu

Teise võimalusena, kui soovime saata sõnumi paljudele muudele komponentidele või soovime sõnumit saata objektile, mis on kaugel pesastatud hierarhias, võime kasutada sõnumi saatmise funktsioone, mis aktsepteerivad funktsiooni nime ja sellele järgnevaid argumente.

gameObject.SendMessage (“MethodName”, params); // Broadcast messagegameObject.SendMessageUpwards (“MethodName”, parameetrid); // Vastu saavad ainult ülaltoodud pesad.

Kiirteate edastamine

Võimalik, et olete sellest varem kuulnud, kui inimesed võrdlevad FPS-mänge, mis põhinevad „füüsikal“ või „kiiretel“. Kiirte levitamine on sisuliselt nagu laseri osuti omamine, mis kokkupuutel kokkupõrke või jäiga kehaga tagastab „löögi” ja edastab objekti üksikasjad.

On kaks stsenaariumi, kus see on kasulik (seal on tõenäoliselt palju rohkem):

  1. Kui kavandasite mänguks relvasüsteemi, võiksite tabamuse tuvastamiseks kasutada kiiret ja isegi kiirte pikkust kohandada nii, et lähivõitlusvahendid lööksid ainult lühikestes kaugustes
  2. Looge hiirekursorilt punkt 3D-ruumis, st kui soovite, et kasutaja saaks strateegiamängus hiirega ühikuid valida.

Nagu näete, on selle kood natuke rohkem kaasatud. Peamine asi, mida mõista, on see, et kiirte heitmine sinna, kus hiir 3D-ruumis osutab, nõuab ScreenPointToRay teisendamist. Põhjuseks on see, et kaamera renderdab 3D-ruumi oma sülearvuti ekraanil 2d-vaateakna, nii et loomulikult on 3D-le tagasi teisaldamiseks tegemist ka projektsiooniga.

Kokkupõrke tuvastamine

Varem mainisime komponente Collider ja Rigidbody, mida saab objektile lisada. Kokkupõrgete reegel on see, et kokkupõrke ühel objektil peab olema jäik keha ja teisel kokkupõrkaja (või mõlemal peavad olema mõlemad komponendid). Kiirhäälingu kasutamisel toimivad kiired ainult objektidega, mille külge on kinnitatud põrkekomponendid.

Kui olete objektile lisatud mis tahes kohandatud komponendis seadistanud, saame kokkupõrgetele reageerimiseks kasutada meetodeid OnCollisionEnter, OnCollisionStay ja OnCollisionExit. Kui kokkupõrketeave on käes, võime GameObjecti vastutada ja kasutada varem õpituid ka selle külge kinnitatud komponentidega suhtlemiseks.

Üks asi, mida tuleb märkida, on see, et jäigad kehad pakuvad objektidele füüsikat, näiteks gravitatsiooni, nii et kui soovite selle välja lülitada, peate kontrollima is_kinematic sisse.

Täpsemad funktsioonid

Me ei hakka seda nüüd käsitlema, vaid võib-olla järgmises artiklis - lihtsalt selleks, et teavitada teid nende olemasolust.

GUI-de loomine

Unityl on oma mängu graafilise kasutajaliidese paigutamiseks täieõiguslik kasutajaliidese mootor. Üldiselt töötavad need komponendid üsna sarnaselt ülejäänud mootoriga.

Unity Editori laiendamine

Unity võimaldab teil lisada inspektoritele kohandatud nuppe, et saaksite redigeerimisrežiimis kogu maailma mõjutada. Näiteks maailma ehitamise hõlbustamiseks võite moodulmajade ehitamiseks välja töötada kohandatud tööriistaakna.

Animatsioon

Unityl on graafikupõhine animatsioonisüsteem, mis võimaldab teil animatsioone segada ja juhtida erinevatel objektidel, näiteks luupõhist animatsioonisüsteemi rakendavatel mängijatel.

Materjalid ja PBR

Unity käivitab füüsikalise renderdamismootori, mis võimaldab reaalajas valgustust ja realistlikke materjale. Reaalsus on see, et peate enne õppima asumist kõigepealt õppima 3D-modelleerimise või kasutama kellegi teise valmistatud ja optimeeritud mudeleid, et tegelikult hea välja nägema.

Nõuanded uutele tulijatele

Kui plaanite oma esimese mängu kirjutada, siis ärge alahinnake ka kõige tühisemate mängude kirjutamiseks vajalikku keerukust ja aega. Pidage meeles, et enamikul Steami välja tulnud mängudest on meeskonnad aastaid täiskohaga töötanud!

Valige lihtne kontseptsioon ja jagage see väikesteks saavutatavateks verstapostideks. On väga soovitatav eraldada mäng võimalikult väikesteks sõltumatuteks komponentideks, kuna teil on palju vähem tõenäoline, et satute vigu, kui hoiate komponente lihtsate, mitte monoliitsete koodiplokkidega.

Enne kui lähete oma mängu mis tahes osale koodi kirjutama, minge uurige, mida keegi teine ​​on sama probleemi lahendamiseks varem teinud - tõenäoliselt on neil palju lahedam lahendus.

Toredad ressursid ja kogukonnad

Mängudisainil on üks parimatest kogukondadest ja selles valdkonnas on hulgaliselt kõrge kvalifikatsiooniga proffe, kes pakuvad sisu tasuta või ilmaasjata. See on valdkond, mis nõuab 3D-modelleerijaid, ideekunstnikke, mängudisainereid, programmeerijaid ja nii edasi. Olen linkinud mõned suurepärased üldised ressursid, mida olen kokku puutunud kõigi nende väljade jaoks allpool:

Kontseptsioon Art

  • Feng Zhu disainikool (üle 90 tunni pikkused ideekunsti õpetused)
  • Tyler Edlin Art (suurepärane BST-i kunstikogukond koos professionaalide tagasisidega igakuiste väljakutsete kohta)
  • Art Cafe (intervjuud ja töötoad kuulsate ideekunstnikega)
  • Trent Kaniuga (illustraator ja 2D-kunstnik, kes teeb ka oma mängu)

3D-modelleerimine

  • CG küpsis (parimad võrgusilma modelleerimise alused blenderis on kunagi olnud, neil on segisti jaoks palju muud suurepärast sisu)
  • Tor Frick (kõva pinna modelleerijad ja skulptuurid segistis)
  • Gleb Alexandrov (lühikesed võimsad renderdamise õpetused Blenderis)

Mängu kujundus

  • DoubleFine Amnesia Fortnight (GameDevid, kes teevad 2-nädalase häkatoni ja salvestavad kogu nende disainiprotsessi)
  • GameMakersi tööriistakomplekt (uurib mängude kujundamise põhimõtteid)

Programmeerimine

  • Käsitsi valmistatud kangelane (mängu ja mootori kirjutamine nullist C-s)
  • Jonathan Blow (indie-arendaja, kes otseülekandeid mängib)
  • Brackeys (kena ühtsuse õpetused)

Järeldus

Loodetavasti teile see õpetus meeldis! Teen natuke graafilise disaini tööd, samuti mängu- ja kasutajaliidese prototüüpe, nii et vaadake oma portfelli ! Olen ka lingitud .

Portfell| LinkedIn