Galvenais iesācēju ceļvedis spēļu izstrādei vienotībā

Vienotība ir lielisks rīks, lai prototipētu visu, sākot no spēlēm, līdz interaktīvām vizualizācijām. Šajā rakstā mēs izskatīsim visu, kas jums jāzina, lai sāktu lietot Unity.

Pirmkārt, mazliet par mani: es esmu hobija apvienības attīstītājs, 3D modelētājs un grafiskais dizainers, kurš vairāk nekā 5 gadus strādājis ar Unity un Blender. Es tagad esmu Finanšu matemātikas students Dublinas Universitātes koledžā, un laiku pa laikam nodarbojos ar ārštata grafisko dizainu, tīmekļa prototipiem un spēļu prototipiem.

Ievads

Šis raksts ir adresēts ikvienam, kurš nekad iepriekš nav izmantojis Unity, bet kuram ir kāda iepriekšēja pieredze programmēšanā vai tīmekļa dizainā / izstrādē. Šī raksta beigās jums vajadzētu būt labam vispārējam motora pārskatam, kā arī visām nepieciešamajām funkcijām un kodam, lai sāktu spēlēt pamatspēli.

Kāpēc Vienotība?

Ja vēlaties veidot spēles

Indie Game izstrādē ir ļoti maz iespēju. Trīs galvenās izvēles, ja vēlaties veidot spēles, ir Unreal, Unity vai GameMaker.

Vienotība, iespējams, ir vismazāk vērtējama no 3 platformām. Tas dod jums ļoti neapstrādātu produktu no kastes, bet ir ļoti elastīgs, labi dokumentēts un ļoti paplašināms, lai izveidotu gandrīz jebkuru spēles žanru, par kuru varat iedomāties.

Ir daudz ļoti veiksmīgu spēļu, piemēram, Escape from Tarkov (FPS), Monument Valley (Puzzler) un This Mine War (stratēģija / izdzīvošana), kas visas ir veidotas Vienotībā.

Patiesībā motors, uz kura jūs veidojat savu pirmo spēli, iespējams, nav kritisks, tāpēc mans padoms ir tikai izvēlēties vienu un iet ar to.

Ja vēlaties prototipēt lietotāju pieredzi

Tā kā vienotība ir tikai dzinējs ar virkni fizikas, animācijas un reāllaika 3D renderēšanu, tā ir arī lieliska telpa, lai izveidotu pilnvērtīgus interaktīvus prototipus UX pētījumiem.

Unity pilnībā atbalsta VR un AR, un tādējādi tas varētu būt lielisks līdzeklis arhitektūras, automatizācijas un simulāciju izpētei ar klientiem.

Šī raksta sadaļas

  • Kāpēc Vienotība?
  • Vienotības redaktora logs
  • Vienotības spēles objekti
  • Vienotības iebūvētie komponenti
  • Pielāgotu komponentu izveide
  • Mono uzvedības struktūra
  • Manipulēšana ar GameObjects
  • Staru apraide
  • Sadursmju noteikšana
  • Papildu funkcijas
  • Padomi jaunpienācējiem
  • Jauki resursi un kopienas
  • Secinājums

Vienotības redaktora logs

Redaktora logs ir sadalīts pāris sadaļās. Mēs to aplūkosim ļoti īsi, jo mēs to pastāvīgi atsaucīsimies visā rakstā. Ja jūs to jau pazīstat, vienkārši izlaidiet garām!

Sižeta skats: ļauj GameObjects izvietot un pārvietot ainas spēles skatā: priekšskatīs, kā spēlētājs redzēs ainu no kameras inspektora: sniedziet informāciju par skatā izvēlēto GameObject. Aktīvi / projekts: šeit tiek saglabāti visi saliekamie elementi, faktūras, modeļi, skripti utt. Hierarhija: iespējo GameObjects ligzdošanu un strukturēšanu skatuves

Tagad mums ir labi sākt!

Vienotības spēles objekti

Kas ir GameObjects

GameObjects ir viss vienības spēļu motora pamatelements. Nosaukums to gandrīz atdod:

Viss, ko jūs ievietojat ainas Vienotībā, jāiesaiņo “spēles objektā”.

Ja jums ir tīmekļa dizaina fons, jūs varat domāt, ka GameObjects ir līdzīgi elementi! Ļoti garlaicīgi konteineri, taču ir ļoti paplašināmi, lai izveidotu sarežģītu funkcionalitāti vai vizuālo materiālu.

Burtiski viss, sākot no daļiņu efektiem, kamerām, atskaņotājiem, lietotāja saskarnes elementiem… (saraksts turpinās), ir GameObject.

Hierarhijas veidošana

Tāpat kā tīmekļa izstrādē, arī GameObject ir konteiners. Tāpat kā jūs ligzdojat, lai izveidotu daudzveidīgus un vēlamus izkārtojumus vai abstrakcijas, jūs varētu vēlēties darīt to pašu ar spēļu objektiem.

Spēļu ligzdošanas loģika ir daudz tāda pati kā tīmekļa izstrāde. Es sniegšu dažus piemērus ...

Juceklis un efektivitāte

Tīmekļa analoģija: jums ir daudz līdzīgu elementu, kurus var dinamiski ģenerēt, reaģējot uz lietotāju mijiedarbību, un vēlaties tos uzturēt kārtībā. Vienotības tulkošana: izveidojot Minecraft klonu, un ainā ir daudz bloku, veiktspējas apsvērumu dēļ no skatuves jāpievieno un jānoņem bloku gabali. Tādējādi ir jēga likt viņiem vecākus iztukšot GameObject katram gabalam, jo, izdzēšot vecāku, tiek noņemti visi bērnu bloki.

Pozicionēšana

Tīmekļa analoģija: jūs vēlaties saglabāt satura pozīciju "attiecībā" pret konteineru, nevis tīmekļa lapu. Vienotības tulkošana: jūs esat izveidojis virkni palīgu bezpilota lidaparātu, kas lidinās ap atskaņotāju. Jūs tiešām negribētu rakstīt kodu, lai liktu viņiem vajāt spēlētāju, tāpēc jūs tos instantificējat kā spēlētāja spēles objekta bērnus.

Vienotības iebūvētie komponenti

Aktiera komponenta modelis

GameObjects paši par sevi ir diezgan bezjēdzīgi - kā mēs redzējām, tie ir diezgan vienkārši konteineri. Lai tiem pievienotu funkcionalitāti, mums jāpievieno komponenti, kas būtībā ir skripti, kas rakstīti vai nu C #, vai Javascript.

Vienotība darbojas pēc aktiera komponenta modeļa, vienkārši runājot, GameObjects ir aktieri, bet Components ir jūsu skripti.

Ja esat rakstījis kādas tīmekļa lietotnes, pirms esat iepazinies ar ideju izveidot mazus atkārtoti izmantojamus komponentus, piemēram, pogas, formas elementus, elastīgus izkārtojumus, kuriem ir dažādas direktīvas un pielāgojamas īpašības. Tad saliekot šos mazos komponentus lielākās tīmekļa lapās.

Šīs pieejas lielā priekšrocība ir atkārtotas izmantošanas līmenis un skaidri noteikti saziņas kanāli starp elementiem. Tāpat arī spēļu izstrādē mēs vēlamies samazināt neparedzētu blakusparādību risku. Ja neesat piesardzīgs, mazas kļūdas parasti iziet no kontroles, un atkļūdošana ir ārkārtīgi sarežģīta. Tādējādi ir svarīgi izveidot mazas, izturīgas un atkārtoti izmantojamas sastāvdaļas.

Galvenie iebūvētie komponenti

Es domāju, ka ir pienācis laiks pieminēt dažus iebūvēto komponentu piemērus, ko nodrošina Vienības spēļu dzinējs.

  • MeshFilter: ļauj jums piešķirt materiālus 3D sietam GameObject
  • MeshRender: ļauj jums piešķirt materiālus 3D sietam
  • [Aile | Mesh] Collider: iespējo GameObject noteikšanu sadursmju laikā
  • Rigidbody: ļauj reālistiskai fiziskai simulācijai darboties ar GameObjects ar 3D acīm un izraisīs atklāšanas notikumus lodziņu sadursmēs
  • Gaisma: izgaismo jūsu ainas daļas
  • Kamera: nosaka atskaņotāja skata punktu, kas jāpievieno GameObject
  • Dažādi lietotāja interfeisa audekla komponenti GUI parādīšanai

Ir daudz vairāk kravu, taču šie ir galvenie, kas jums jāiepazīst. Viens padoms ir tāds, ka visiem dokumentu dokumentiem varat piekļūt, izmantojot vienotības rokasgrāmatu un skriptu norādes bezsaistē neatkarīgi no atrašanās vietas:

Pielāgotu komponentu izveide

Iebūvētie komponenti galvenokārt kontrolē fiziku un vizuālo materiālu, taču, lai patiešām izveidotu spēli, jums būs jāpieņem lietotāja ievadi un jārīkojas ar šiem standarta komponentiem, kā arī pašiem GameObjects.

Lai sāktu veidot komponentus, dodieties uz vēlamo GameObject> Pievienot komponentu> meklēšanas joslā ierakstiet jaunā komponenta nosaukumu> jauns skripts (c #).

Kā vispārēju ieteikumu es ieteiktu nelietot Javascript vietnē Unity. Tas nav atjaunināts ar visām lieliskajām lietām, kas nāk ar ES6, un lielākā daļa progresīvāko lietu paļaujas uz C # lietām, kas pārnestas uz Javascript ... Manā pieredzē tas vienkārši kļūst par vienu milzīgu problēmu.

Mono uzvedības struktūra

Galvenās funkcijas

Visi komponenti tiek mantoti no MonoBehaviour klases. Tas ietver vairākas standarta metodes, pats galvenais:

  • void Start (), kas tiek izsaukts ikreiz, kad ainā tiek parādīts objekts ar skriptu. Tas ir noderīgi jebkurā laikā, kad mēs vēlamies veikt kādu inicializācijas kodu, piem. iestatiet spēlētāja aprīkojumu pēc tam, kad viņi nārsto mačā.
  • void Update (), ko sauc par katru kadru. Šeit tiks novirzīta lielākā daļa koda, kas ietver lietotāja ievadi, atjauninot dažādas īpašības, piemēram, atskaņotāja kustību skatuves.

Inspektora mainīgie

Bieži vien mēs vēlamies padarīt komponentus pēc iespējas elastīgākus. Piemēram, visiem ieročiem var būt atšķirīgs bojājums, uguns ātrums, redzamība utt. Kaut arī visi ieroči būtībā ir viens un tas pats, mēs, iespējams, vēlēsimies ātri izveidot dažādas variācijas, izmantojot vienības redaktoru.

Vēl viens piemērs, kur mēs to varētu vēlēties darīt, ir, izveidojot lietotāja saskarnes komponentu, kas izseko lietotāja peles kustības un novieto kursoru skatu portā. Šeit mēs varētu vēlēties kontrolēt kursora jutīgumu pret kustībām (ja lietotājs izmantoja kursorsviru vai spēļu vadības paleti salīdzinājumā ar datora peli). Tāpēc būtu lietderīgi šos mainīgos viegli mainīt gan rediģēšanas režīmā, gan arī eksperimentēt ar tiem izpildlaika laikā.

Mēs to varam viegli izdarīt, vienkārši deklarējot tos kā publiskos mainīgos komponenta pamattekstā.

Lietotāja ievade tiek pieņemta

Protams, mēs vēlamies, lai mūsu spēle reaģētu uz lietotāja ievadiem. Visizplatītākie veidi, kā to izdarīt, ir komponenta (vai jebkur citur, kur vēlaties) funkcijas Update () funkcijas:

  • Input.GetKey (KeyCode.W) Atgriež True W taustiņu
  • Input.GetKeyDown (KeyCode.W) atgriež vērtību True, kad pirmo reizi nospiežat W taustiņu
  • Input.GetAxis (“Vertical”), Input.GetAxis (“Horizontal”) Atgriež starp -1,1 peles ievades kustību

Manipulēšana ar GameObjects

Kad būsim ievadījuši lietotāju, mēs vēlamies, lai GameObjects mūsu ainā reaģētu. Mēs varam apsvērt vairākus atbilžu veidus:

  • Tulkošana, rotācija, mērogs
  • Izveidojiet jaunus GameObjects
  • Ziņojumu sūtīšana esošajiem GameObjects / komponentiem

Pārvērtības

Visiem GameObjects ir transformācijas rekvizīts, kas ļauj veikt dažādas noderīgas manipulācijas ar pašreizējo spēles objektu.

Iepriekš minētās metodes ir diezgan pašsaprotamas, tikai ņemiet vērā, ka mēs izmantojam mazos burtus gameObject, lai atsauktos uz GameObject, kam pieder šis konkrētais komponenta gadījums.

Parasti laba prakse ir izmantot lokālu [Position, Rotation], nevis objekta globālo pozīciju / rotāciju. Tas parasti atvieglo objektu pārvietošanu tādā veidā, kas ir jēgpilns, jo vietējā kosmosa ass būs orientēta un centrēta uz vecāku objektu, nevis pasaules izcelsmi un x, y, z virzieniem.

Ja jums ir jāpārveido starp vietējo un pasaules telpu (kas bieži notiek), varat izmantot:

Kā jūs varat iedomāties, aiz tā ir kāda diezgan vienkārša lineārā algebra, uz kuru norāda metodes nosaukumā esošais 'apgrieztais'.

Jaunu GameObjects izveide

Tā kā GameObjects būtībā ir viss jūsu ainā, jūs varētu vēlēties, lai tos varētu ģenerēt lidojot. Piemēram, ja jūsu atskaņotājam ir sava veida lādiņu palaišanas iekārta, iespējams, vēlēsities spēt izveidot lidojumus, kuriem ir sava iekapsulēta loģika lidošanai, bojājumu novēršanai utt.

Vispirms mums jāievieš saliekamā elementa jēdziens . Mēs tos varam izveidot, vienkārši ievelkot jebkuru GameObject ainu hierarhijā aktīvu mapē.

Tas būtībā saglabā objekta veidni, kas tikko bija mūsu ainā, ar visām tām pašām konfigurācijām.

Kad mums būs šie saliekamie komponenti, mēs tos varēsim piešķirt inspektora mainīgajiem (kā mēs par to runājām iepriekš) jebkuram skatuves komponentam, lai mēs jebkurā laikā varētu izveidot jaunus GameObjects, kā norādīts paneļa komplektācijā.

Pēc tam mēs varam veikt saliekamā elementa “tūlītēju atrašanu” un manipulēt ar to vēlamajā vietā ainā un izveidot nepieciešamās vecāku attiecības.

Piekļuve citiem GameObjects un komponentiem

Bieži mums ir jāsazinās ar citiem GameObjects, kā arī ar tiem saistītajiem komponentiem. Kad jums ir atsauce uz spēles objektu, tas ir diezgan vienkārši.

ComponentName comp = some_game_object.GetComponent ();

Pēc tam jūs varat piekļūt jebkurai no komponentes publiskajām metodēm / mainīgajiem, lai manipulētu ar GameObject. Tas ir vienkāršs bits, tomēr faktiski atsauci uz GameObject var izdarīt vairākos veidos ...

Piekļuve, izmantojot inspektora mainīgo

Tas ir visvienkāršākais. Vienkārši izveidojiet GameObject publisko mainīgo, kā mēs to iepriekš pierādījām ar prefabiem, un manuāli velciet un nometiet to uz komponenta, izmantojot inspektoru. Pēc tam piekļūstiet mainīgajam, kā norādīts iepriekš.

Piekļuve, izmantojot marķēšanu

Ar inspektora starpniecību mēs varam marķēt GameObjects vai prefabus un pēc tam izmantot spēles objekta atrašanas funkcijas, lai atrastu atsauces uz tiem.

Tas tiek vienkārši izdarīts, kā norādīts zemāk.

GameObject some_game_object = GameObject.FindGameObjectWithTag (“Ķieģelis”);

Piekļuve, izmantojot transformāciju

Ja mēs vēlamies piekļūt kāda vecāka objekta komponentiem, mēs to varam viegli izdarīt, izmantojot transformācijas atribūtu.

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

Piekļūstiet, izmantojot SendMessage

Alternatīvi, ja mēs vēlamies nosūtīt ziņojumu daudziem citiem komponentiem vai vēlamies nosūtīt ziņojumu objektam, kas atrodas tālu augšpusē ar ligzdotu hierarhiju, mēs varam izmantot ziņojumu sūtīšanas funkcijas, kas pieņem funkcijas nosaukumu, kam seko argumenti.

gameObject.SendMessage (“MethodName”, parametri); // Broadcast messagegameObject.SendMessageUpwards (“MethodName”, parametri); // Saņem tikai komponenti, kas ir ligzdoti iepriekš.

Staru apraide

Iespējams, esat par to dzirdējis jau iepriekš, kad cilvēki salīdzina FPS spēles, kas ir balstītas uz fiziku vai uz stariem. Apraides apraide būtībā ir tāda pati kā lāzera rādītājs, kas, nonākot saskarē ar “sadursmi” vai “stingru ķermeni”, atgriež “trāpījumu” un nodod atpakaļ objekta detaļas.

Ir divi scenāriji, kur tas ir noderīgi (iespējams, ka ir vēl vairāk):

  1. Ja jūs projektējat ieroču sistēmu spēlei, trāpījumu noteikšanai varat izmantot staru apraidi un pat pielāgot stara garumu, lai tuvcīņas priekšmeti “trāpītu” tikai nelielos attālumos.
  2. Izveidojiet staru no peles rādītāja līdz punktam 3d telpā, ti, ja vēlaties, lai lietotājs stratēģijas spēlē varētu atlasīt vienības ar peli.

Kā redzat, kods tam ir nedaudz vairāk iesaistīts. Galvenais, kas jāsaprot, ir tas, ka, lai raidītu staru uz vietu, kur pele norāda 3D telpā, ir jāveic pārveidošana ScreenPointToRay. Iemesls tam ir, ka kamera jūsu 3D klēpjdatora ekrānā atveido 3D telpu kā 2d skata vietu, tāpēc, protams, ir paredzēta projekcija, lai pārsūtītu atpakaļ uz 3D.

Sadursmju noteikšana

Iepriekš mēs pieminējām Collider un Rigidbody komponentus, kurus var pievienot objektam. Sadursmju noteikums ir tāds, ka vienam sadursmes objektam jābūt ar stingru virsbūvi, bet otram - uz sadursmes (vai abiem jābūt abiem komponentiem). Ņemiet vērā, ka, izmantojot staru apraidi, stari mijiedarbosies tikai ar objektiem, kuriem ir pievienoti sadursmes komponenti.

Kad esat iestatījis jebkuru objektam pievienotu pielāgotu komponentu, mēs varam izmantot OnCollisionEnter, OnCollisionStay un OnCollisionExit metodes, lai reaģētu uz sadursmēm. Kad mums ir informācija par sadursmi, mēs varam iegūt GameObject atbildību un izmantot iepriekš iemācīto, lai mijiedarbotos ar tam pievienotajiem komponentiem.

Jāatzīmē, ka cietie ķermeņi nodrošina fiziku, piemēram, priekšmetu gravitāciju, tādēļ, ja vēlaties, lai tas būtu izslēgts, jums būs jāpārbauda is_kinematic .

Papildu funkcijas

Tagad mēs to neiedziļināsimies, bet, iespējams, nākamajā rakstā - tikai tāpēc, lai jūs apzinātos, ka tie pastāv.

GUI izveide

Unity ir pilnībā izveidots lietotāja interfeisa dzinējs, kas paredzēts spēles GUI izlikšanai. Parasti šie komponenti darbojas diezgan līdzīgi kā pārējais motors.

Vienotības redaktora paplašināšana

Unity ļauj inspektoriem pievienot pielāgotas pogas, lai rediģēšanas režīmā varētu ietekmēt pasauli. Piemēram, lai palīdzētu celtniecībā pasaulē, jūs varat izstrādāt pielāgotu rīku logu moduļu māju celtniecībai.

Animācija

Unity ir uz grafikiem balstīta animācijas sistēma, kas ļauj apvienot un kontrolēt dažādu objektu animācijas, piemēram, spēlētājus, kas ievieš animācijas sistēmu uz kauliem.

Materiāli un PBR

Unity iedarbina fiziski balstītu renderēšanas dzinēju, kas nodrošina reāllaika apgaismojumu un reālistiskus materiālus. Patiesībā jums vispirms būs jāapgūst 3D modelēšana, vai arī jāizmanto modeļi, kurus kāds ir izgatavojis un optimizējis kāds cits, pirms nonākat pie tā, lai izgatavotu tādas lietas, kas patiesībā izskatās labi.

Padomi jaunpienācējiem

Ja plānojat rakstīt savu pirmo spēli, nenovērtējiet par zemu sarežģītību un laiku, kas vajadzīgs, lai rakstītu pat vissīkākās spēles. Atcerieties, ka lielākajā daļā spēļu, kas iznāk Steam, komandas strādā pie tiem visu laiku!

Izvēlieties vienkāršu koncepciju un sadaliet to mazos sasniedzamos pagrieziena punktos. Ir ļoti ieteicams spēli sadalīt pēc iespējas mazākos neatkarīgos komponentos, jo daudz mazāk ticams, ka uzskriet kļūdas, ja komponentus paturat vienkāršus, nevis monolītus kodu blokus.

Pirms dodaties un rakstāt kodu jebkurai spēles daļai, dodieties un izpētiet, ko kāds cits ir darījis iepriekš, lai atrisinātu to pašu problēmu - iespējams, viņiem būs daudz slaidāks risinājums.

Jauki resursi un kopienas

Spēļu dizainā ir viena no labākajām kopienām, kas pastāv, un šajā nozarē ir daudz augsti kvalificētu profesionāļu, kuri saturu piedāvā bez maksas vai par neko. Tā ir joma, kurai nepieciešami 3D modelētāji, konceptu mākslinieki, spēļu dizaineri, programmētāji un tā tālāk. Esmu saistījis dažus lieliskus vispārīgus resursus, ar kuriem esmu saskāries katrā no šiem laukiem:

Koncepcijas māksla

  • Feng Zhu dizaina skola (vairāk nekā 90 stundas garas koncepcijas mākslas apmācības)
  • Tailers Edlins Art (lieliska BST mākslas kopiena ar profesionāļu atsauksmēm par ikmēneša izaicinājumiem)
  • Mākslas kafejnīca (intervijas un semināri ar slaveniem konceptuālajiem māksliniekiem)
  • Trents Kaniuga (ilustrators un 2D mākslinieks, kurš arī veido savu spēli)

3D modelēšana

  • CG sīkdatne (labākie acu modelēšanas pamati blenderī, jebkad tie ir aprīkoti ar citu izcilu saturu blenderim)
  • Tor Frick (cieto virsmu modelētāji un tēlnieki blenderī)
  • Gļebs Aleksandrovs (īsas jaudīgas renderēšanas apmācības Blenderī)

Spēļu dizains

  • DoubleFine Amnesia Fortnight (GameDevs, kas veic divu nedēļu hakatonu un reģistrē visu viņu dizaina procesu)
  • GameMakers rīkkopa (pārbauda spēles dizaina principus)

Programmēšana

  • Handmade Hero (spēles un dzinēja rakstīšana no nulles C)
  • Džonatans Blovs (Indie dev, kurš tiešraidē pārraida savu spēli)
  • Brackeys (jaukas vienotības apmācības)

Secinājums

Ceru, ka jums, puiši, patika šī apmācība! Es daru mazliet grafiskā dizaina darbu, kā arī spēļu un lietotāja interfeisa prototipus, tāpēc pārbaudiet manu portfeli ! Esmu arī saistīts ar saiti .

Portfelis| LinkedIn