Programarea unui joc cu unitate: un ghid pentru începători

Programarea unui joc cu unitate: un ghid pentru începători
Acest ghid este disponibil pentru descărcare în format PDF gratuit. Descărcați acest fișier acum . Simțiți-vă liber să copiați și să partajați acest lucru cu prietenii și familia.

O caracteristică surprinzătoare a economiei internetului este creșterea jocurilor video independente. Odată ce a fost domeniul exclusiv al studiourilor triple-A de mii de oameni, multi-milioane de dolari, au fost dezvoltate o serie de instrumente care aduc resursele moderne de dezvoltare a jocurilor în mâinile persoanelor fizice sau colecții mici, ad-hoc de programatori și designeri. Am discutat anterior cele mai bune jocuri independente, așa că asigurați-vă că le verificați pentru inspirație cu privire la ce se poate realiza cu instrumente precum Unity.





Aceste echipe de dezvoltare a jocurilor independente au demonstrat o agilitate și o toleranță la risc care, în multe cazuri, le permite să împingă inovația în joc mai repede decât omologii lor cu buget mare. O serie de titluri indie de succes șocant au avut premiera în ultimii ani, inclusiv Minecraft , Depozit de vechituri , și Super Meat Boy , și chiar dacă nu trebuie să aveți abilități pentru a crea astfel de jocuri, puteți crea un joc folosind Buildbox.





În peisajul în evoluție rapidă a dezvoltării jocurilor independente, Unitate a devenit un standard de facto: costul redus, ușurința în utilizare și setul larg de caracteristici îl fac ideal pentru dezvoltarea rapidă a jocului. Unitatea este atât de flexibilă, încât poți chiar creați-vă propriile controlere de joc personalizate cu un pic de DIY știu cum!





Chiar și studiouri mari precum CCP (Dezvoltatori de Eve Online ) folosiți-l pentru prototiparea rapidă a conceptelor de joc. Unity oferă un „motor de joc într-o cutie” - un motor de fizică și redare cu cârlige pentru mai multe limbaje de scriptare, adaptabil la practic orice gen de jocuri video.

În timp ce Unity oferă un editor vizual pentru manipularea mediului de joc, Unity nu este un instrument de creație a jocului „programare zero”. Vă cere să programați pentru a produce rezultate, dar vă oferă, de asemenea, un instrument mult mai flexibil și mai puternic decât ar putea face orice program de „game maker”.



Unity nu va face treaba pentru dvs., dar reduce în mod substanțial bariera la intrare. Începând complet de la zero cu C ++ și OpenGL, poate dura zile până să ajungă la punctul în care există de fapt ceva redat pe ecran. Folosind Unity, durează aproximativ zece secunde. Unity pune elementele de bază ale creării de jocuri în mâinile programatorilor începători într-un mod rapid, intuitiv.

Astăzi vă voi ghida prin tot ce trebuie să știți pentru a face un joc în Unity, care este împărțit în zece capitole principale:





§1 – Versiunile unității

§2 – Instalarea Unity





§3 – O scurtă introducere în paradigma orientată pe obiecte

§4 – Bazele Unității

§5 – Exemplu: elemente de bază ale unui joc

§6 – Scriptarea în unitate

§7 – Exemplu: Scripting Pong

§8 – Explorarea documentației / Învățarea mai mult

§9 – Construirea jocului / Compilarea cu o aplicație independentă

§10-Note de închidere

1. Versiuni de unitate

Unity vine în două variante de bază: versiunea pro și versiunea gratuită. Există un numărul diferențelor , dar, în linii mari, versiunea pro acceptă o serie de îmbunătățiri vizuale (cum ar fi umbrele moi în timp real și post-procesare) și un număr mare de caracteristici relativ minore, care sunt extrem de utile pentru jocuri mai complexe.

Acestea fiind spuse, pentru majoritatea jocurilor relativ simple pe care ați putea dori să le construiți, versiunea gratuită a Unity este perfect adecvată. Vom detalia mai jos diferențele cheie de mai jos pentru cei interesați.

1.1 Prețuri

Versiunea gratuită a Unity este, desigur, gratuită. Cu toate acestea, există câteva limitări: versiunea gratuită a Unity nu poate fi licențiată pentru nicio companie cu un venit anual de peste 100.000 dolari . Deși astfel de organizații sunt dincolo de sfera acestui ghid, dacă bănuiți că ați putea deveni o astfel de organizație, este probabil înțelept să recurgeți la versiunea Pro.

Versiunea Pro a Unity este 75 USD o lună sau 1500 USD pentru o licență permanentă și nu are limite în ceea ce puteți face cu jocurile create cu aceasta. Există, de asemenea, o perioadă de încercare gratuită de 30 de zile, pe care o vom folosi pentru acest ghid, pentru a vă oferi o prezentare cât mai completă a funcțiilor disponibile. De asemenea, este disponibilă o licență de student pe un an Studiu pentru 129 USD .

1.2 Caracteristici

Există multe caracteristici absente în versiunea gratuită a Unity. Cu toate acestea, cele mai importante diferențe sunt după cum urmează: versiunea gratuită a Unity nu are o serie de opțiuni de redare care să permită jocuri mai performante și mai rapide (suport LOD, post-procesare a spațiului pe ecran, umbrere avansate, soft în timp real umbrele și redarea amânată). De asemenea, îi lipsește completul sistem de animatie mechanim și câteva instrumente AI.

În general, pentru proiecte complexe, la scară largă, sau proiecte în care performanța grafică este importantă, versiunea pro merită. Folosesc versiunea pro, deoarece dezvolt jocuri de realitate virtuală pentru Oculus Rift, iar suportul de post-procesare a spațiului pe ecran este necesar pentru a interacționa corect cu setul cu cască.

2. Instalarea Unity

Unitatea este ușor de instalat. Puteți descărca executabilul de pe unitate3d.com/get-unity/download .

După descărcare, rulați-l, apoi urmați instrucțiunile instalatorului. Când instalarea este terminată, va apărea o fereastră intitulată „activați licența Unity”. Bifați caseta marcată „activați o perioadă de încercare gratuită de 30 de zile a Unity Pro” și apoi „OK”.

Felicitări! Acum aveți o încercare de 30 de zile a Unity Pro. Când perioada de încercare expiră, dacă nu doriți să cumpărați versiunea pro, puteți trece la versiunea gratuită și puteți păstra conținutul existent.

cum se poate spune dacă ssd eșuează

3. O scurtă introducere în paradigma orientată pe obiecte

Înainte de a începe cu Unity, este important să trecem puțin peste elementele de bază. Unity le susține pe amândouă C # și JavaScript pentru programarea jocurilor ; vom lucra cu C # pentru acest tutorial.

În primul rând, dacă nu v-ați programat niciodată înainte, lăsați acest tutorial deoparte și petreceți câteva zile lucrând prin Microsoft C # Limbaj de bază până când vă simțiți confortabil folosind limbajul pentru sarcini simple.

Dacă doriți ceva un pic diferit de C # (dar nu neapărat un limbaj pe care îl puteți folosi în Unity), atunci aruncați o privire la ghidul nostru pentru cele șase limbaje de programare cele mai ușoare pentru începători.

Dacă ați programat anterior într-un limbaj imperativ sau orientat obiect, cum ar fi C sau Java, parcurgeți manualul și familiarizați-vă cu modul în care C # diferă de alte limbi pe care le-ați folosit în trecut. Oricum, nu continuați cu tutorialul până nu vă simțiți confortabil rezolvând probleme simple cu C # (de exemplu, dacă v-aș ruga să scrieți un program care tipărește primele sute de numere prime, ar trebui să puteți scrie acel program fără consultând Google).

Cel mai important concept de înțeles aici este paradigma orientată pe obiecte (prescurtată ca DESCHIS ). În limbajele orientate obiect, programele sunt împărțite în unități funcționale numite Obiecte . Fiecare obiect are propriile variabile și funcții private. Funcțiile specifice obiectelor sunt numite metode .

Ideea de aici este modularitatea: având fiecare obiect izolat și forțând alte obiecte să interacționeze cu el prin metodele sale, puteți reduce numărul posibilelor interacțiuni neintenționate - și, prin extensie, bug-uri. De asemenea, puteți crea obiecte pe care le puteți reutiliza ulterior fără nicio modificare. În Unity, veți construi aceste obiecte și le veți atașa entități de joc (al cărui comportament îl vor guverna).

Obiectele sunt instanțiate din clase : o clasă este doar un fișier care prezintă definiția obiectului dvs. Deci, dacă doriți un mook obiect care gestionează AI pentru un inamic din jocul tău, ai scrie o clasă „Mook” și apoi ai atașa acel fișier fiecărei entități inamice. Când vă rulați jocul, fiecare inamic va fi echipat cu o copie a obiectului „Mook”.

Atașarea unui nou script la un obiect arată astfel:

Primul, selectați obiectul și du-te la Inspector . Faceți clic pe Adăugați o componentă buton.

Mergi la script nou , introduceți numele dorit și faceți clic pe creați și adăugați .

Acum aveți un nou script pe care îl puteți edita făcând dublu clic pe el!

Un fișier de clasă arată cam așa:

using UnityEngine;
public class Mook : MonoBehaviour {
private float health;
void Start () {
health = 100;
}
void Update(){
if (health > 0) {
/* Search for player
if you encounter the player on the road, kill him
if you get shot, remove a random amount of health */
}
}
}

Să descompunem acest lucru:

  • Utilizarea UnityEngine: Această linie îi spune lui C # că dorim să folosim bibliotecile Unity, care ne permit să ne conectăm la motorul de joc Unity.
  • Clasă publică Mook: MonoBehaviour: Această linie declară clasa și numele ei - mook .
  • Sănătatea plutitorului privat: Aceasta declară o variabilă de clasă privată (care poate fi modificată doar din interiorul clasei). Variabilei i se dă o valoare în start .
  • Void Start (): Aceasta declară o metodă numită start . Start este o metodă specială care rulează o singură dată, când jocul se lansează inițial.
  • Actualizare nulă (): Actualizarea este o altă metodă specială, care rulează pe fiecare cadru. Majoritatea logicii jocului tău va merge aici.
  • // dacă întâlnești jucătorul pe drum, ucide-l: Această linie este un comentariu (orice linie care începe cu o bară dublă este ignorată de C #). Comentariile sunt folosite pentru a vă reaminti ce fac anumite fragmente de cod. În acest caz, acest comentariu este folosit pentru a reprezenta un bloc mai complicat de cod care face de fapt ceea ce descrie comentariul.

Împreună cu start și Actualizați , vă puteți crea propriile metode cu aproape orice nume. Cu toate acestea, metodele pe care le creați nu vor rula decât dacă sunt apelate. Să declarăm o metodă pentru o clasă ipotetică numită addTwoNumbers care adaugă două numere împreună:

public float addTwoNumbers(float a, float b) {
return a+b;
}

Aceasta declară o metodă publică (accesibilă altor obiecte) care returnează un float, numit addTwoNumbers , care ia două flotări ca intrare (numit la și b ). Apoi returnează suma celor două valori ca ieșire.

Apelarea acestei metode din aceeași clasă (să zicem, din interior Actualizați ) arata asa:

float result = addTwoNumbers(1, 2);

Apelarea metodei de la o altă clasă este similară:

addTwoNumbers instance;
float result = instance.addTwoNumbers(1, 2);

Din nou, acest lucru creează doar o instanță a clasei noastre, accesează metoda adecvată și îi alimentează numerele pe care dorim să le adăugăm, apoi stochează rezultatul în rezultat . Simplu.

Dacă scriptul dvs. este atașat la un obiect care are proprietăți speciale (cum ar fi un emițător de particule) care nu poate fi accesat sub setul normal de parametri GameObject, puteți alege să îl tratați ca pe un alt tip de entitate de joc utilizând GetComponent metodă.

Sintaxa pentru aceasta arată astfel:

GetComponent().Play();

Dacă oricare dintre acestea nu vă este familiar, reveniți și treceți prin grundul C #. Vă va salva multă frustrare pe măsură ce vom continua.

4. Bazele Unității

În această secțiune, vom lucra în mecanica de bază a motorului Unity. Fluxul de lucru în Unity merge cam așa:

  1. Creați o entitate pentru a îndeplini un rol în joc (gol GameObjects poate fi folosit pentru sarcini logice abstracte).
  2. Scrieți sau găsiți un fișier de clasă și adăugați-l la entitate ca un script (folosind Adăugați o componentă butonul din inspector vedere.
  3. Alerga > Test > depanare > repeta până când funcționează și treceți la următorul element al jocului.

Unity vine cu o serie de file de vizualizare de bază care pot fi prezentate în diferite moduri pe gustul utilizatorului. Cele cinci mari sunt:

  1. Joc: afișează o instanță de rulare a jocului cu care puteți interacționa și testa.
  2. Scenă: oferă o versiune statică, editabilă a fișierului lumea jocurilor .
  3. Inspector: vă permite să modificați entități individuale din lumea jocului selectându-le în editor filă.
  4. Proiect: vă permite să navigați prin fișierele proiectului și să trageți modele, materiale și alte resurse în editor filă pentru a le plasa în lumea jocului.
  5. Ierarhie: această filă afișează toate obiectele din lume, permițându-vă să găsiți obiecte îndepărtate în scenă și entități părinte unul față de celălalt făcând clic și trăgând.

Vedeți diagrama de mai jos pentru localizarea tuturor acestor lucruri:

4.1 Entități de unitate

4.1.1 Plase

Oțelurile sunt calea Geometrie 3D este reprezentat în Unitate. Puteți folosi fie unitatea integrată a Unity primitiv obiecte (cuburi, sfere, cilindri etc.) sau importați propriile modele 3D dintr-un pachet de modelare, cum ar fi Blender sau Maya . Unity acceptă o varietate de formate 3D, inclusiv .fbx , și .3ds .

Instrumentele de bază pentru manipularea ochiurilor de plasă sunt butoanele de scalare, rotație și traducere din colțul din stânga sus al interfeței. Aceste butoane adaugă pictograme de control modelelor din vizualizarea editor, care pot fi apoi utilizate pentru a le manipula în spațiu. Pentru a modifica textura sau proprietățile fizice ale unui obiect, selectați-le și utilizați inspector vizualizare pentru a analiza material și corp rigid elemente.

4.1.2 Elemente GUI

Sprite și text tradițional GUI pot fi afișate folosind Text GUI si Textură GUI GameObjects în editor. Cu toate acestea, o modalitate mai robustă și mai realistă de a gestiona elementele UI este de a utiliza Text 3D și Quad GameObjects (cu texturi transparente și un nuanț transparent transparent) pentru a plasa elementele HUD în lumea jocului ca entități.

În ierarhie vizualizați, aceste elemente de joc pot fi trase pe camera principală pentru a-i face copii, asigurându-se că se mișcă și se rotesc împreună cu camera.

Elementele GUI (text și texturi) pot avea dimensiunea și scala ajustate folosind câmpurile relevante din fila inspector.

4.1.3 Materiale

Materialele sunt combinații de texturi și umbrere și pot fi trase direct pe obiecte de joc din fila proiect. Un număr mare de umbrere vin cu Unity Pro și puteți regla textura atașată acestora folosind fila inspector pentru un obiect la care sunt aplicate.

Pentru a importa o textură, convertiți-o în .jpg , .png , sau .bmp , și trageți-l în active din directorul proiectului Unity (care apare în Documentele mele în mod implicit). După câteva secunde, va apărea o bară de încărcare în editor. Când se termină, veți putea găsi imaginea ca textură sub proiect filă.

4.1.5 Lumini

Luminile sunt GameObjects care proiectează strălucirea asupra lumii. Dacă nu există lumini în scena dvs., toate poligoanele sunt desenate la același nivel de luminozitate, oferind lumii un aspect plat, spălat.

Luminile pot fi poziționate, rotite și au mai multe caracteristici interne pe care le puteți personaliza. The intensitate glisorul controlează luminozitatea luminii și gamă controlează cât de repede se estompează.

Orientările din vedere la scenă vă arată intervalul maxim de iluminare. Joacă cu ambele setări pentru a obține efectul dorit. De asemenea, puteți regla culoarea luminii, modelul ( fursec afișat la suprafață spre care este îndreptată lumina și ce fel de flare apare pe ecran atunci când se uită direct la lumină. Cookie-ul poate fi folosit pentru a falsifica modele de lumină mai realiste, pentru a crea umbre false dramatice și pentru a simula proiectoare.

Cele trei tipuri principale de lumină sunt loc , punct , și direcțional .

Spoturi au o locație în spațiul 3D și proiectează lumina doar într-o direcție într-un con de unghi variabil. Acestea sunt bune pentru lanterne, reflectoare și, în general, vă oferă un control mai precis al iluminării. Spoturile pot arunca umbre.

Luminile punctuale au o locație în spațiul 3D și luminează uniform în toate direcțiile. Luminile punctuale nu aruncă umbre.

Luminile direcționale , în cele din urmă, sunt folosite pentru a simula lumina soarelui: proiectează lumina într-o direcție ca și cum ar fi infinit de departe. Luminile direcționale afectează fiecare obiect din scenă și pot produce umbre.

4.1.6 Sisteme de particule

LA Sistemul de particule este un GameObject care generează și controlează sute sau mii de particule simultan. Particulele sunt obiecte 2D mici, optimizate, afișate în spațiu 3D. Sistemele de particule utilizează redare simplificată și fizică, dar pot afișa mii de entități în timp real, fără a se bâlbâi, făcându-le ideale pentru fum, foc, ploaie, scântei, efecte magice și multe altele.

Există o mulțime de parametri pe care îi puteți modifica pentru a obține aceste efecte și le puteți accesa generând un sistem de particule sub editor de componente > selectarea sistemului de particule > deschizând fila inspector . Puteți modifica dimensiunea, viteza, direcția, rotația, culoarea și textura fiecărei particule și puteți seta majoritatea acestor parametri să se schimbe și în timp.

Sub coliziune atribut, dacă îl activați și setați spațiul de simulare la lume veți obține particule care se vor ciocni cu obiecte din lume, care pot fi utilizate pentru o serie de efecte particulare realiste, inclusiv ploaie, apă în mișcare și scântei.

5. Exemplu: Elemente de bază ale unui joc

Pentru acest tutorial, vom face un joc simplu de Pong - ceva ce am tratat de mai multe ori în bricolaj înainte:

  • Arduino Classic Pong
  • Arduino OLED Pong

În această secțiune, vom analiza aranjarea elementelor de bază - tutorialul de scriptare va veni mai târziu.

În primul rând, să descompunem jocul Pong în componentele sale de bază. În primul rând, avem nevoie de două palete și o minge. Mingea zboară în afara ecranului, așa că vom dori un mecanism pentru ao reseta. De asemenea, dorim ca textul să afișeze scorul curent și, de dragul de a vă arăta toate elementele esențiale ale Unity, vom dori un efect de particule fantezist atunci când loviți mingea. Întregul joc va trebui să fie luminat dramatic.

Asta se descompune într-un obiect de minge (o sferă), a reproducător , două recuzită cu paletă cu emițătoare de particule atașat o Entitate de text 3D , și a spot spot . Pentru acest tutorial, vom folosi materialul fizic implicit sări , cu combina combinată setat la multiplica . Iată cum arată configurarea, în zece capturi de ecran:

Mai întâi, creați un cub prop pentru paletă.

Scalați-l corespunzător, copiați-l , și puneți un sferă între paletele pentru minge.

Apoi, creați un Obiect 3DText și scară și poziţie corect, schimbând marimea fontului atribut pentru a obține o imagine mai puțin pixelată.

Apoi, creați două sisteme de particule , alegeți caracteristicile dorite și atașați-le la palete.

Apoi, veți dori poziționați și rotiți camera astfel încât să încadreze corect scena. În timp ce camera este selectată, puteți vedea o mică previzualizare a vederii camerei în colțul din dreapta jos.

Înainte de a termina, trebuie să creăm două cuburi suplimentare pentru a fi bare de protecție, pentru a împiedica mingea să sară din zona de joc. Le putem face invizibile debifând mesh renderer în fila inspector .

Dacă lovești jocul, poți vedea acum elementele de bază ale jocului nostru. Nu vor face încă nimic, dar vom ajunge la asta!

Acum că avem această configurație, vom vorbi despre ceea ce este implicat în scriptarea acestor elemente pentru a crea un joc.

6. Scriptarea în unitate

Odată ce aveți un script atașat la un obiect, îl puteți revizui făcând dublu clic pe acesta în inspector . Aceasta se deschide MonoDevelop , mediul de dezvoltare implicit pentru Unity. În esență, Monodevelop este un editor de text cu caracteristici special optimizate pentru programare.

Cuvintele cheie și comentariile sunt evidențiate în albastru și verde , iar valorile numerice și șirurile apar în net . Dacă ați folosit Eclipsă sau alte IDE, MonoDevelop este foarte asemănător. Poti construi scripturile din interiorul editorului, pentru a verifica erorile de sintaxă, așa:

În general, pentru ca scriptul dvs. să interacționeze cu Unity, va trebui să faceți referire la elementele pe care le deține obiectul care deține scriptul (puteți vedea o listă a acestor elemente în inspector când este selectat obiectul relevant). Apoi puteți apela metode sau setați variabile pentru fiecare dintre aceste elemente pentru a promova modificările dorite.

Dacă doriți ca un script pentru un obiect să afecteze proprietățile unui alt obiect, puteți crea un gol GameObject variabilă în scriptul dvs. și utilizați fișierul inspector pentru a-l atribui altui obiect din scenă.

O listă a elementelor pe care le poate avea un obiect este următoarea (luată din vizualizarea inspectorului uneia dintre paletele noastre din exemplul de mai sus):

  1. Transforma
  2. Cub (filtru de plasă)
  3. Box Collider
  4. Mesh Renderer

Fiecare dintre aceste aspecte ale obiectului poate fi influențat din interiorul unui script. În continuare, vom analiza exact cum.

6.1 Transformare

Funcțiile de transformare pentru un GameObject în Unity controlează parametrii fizici ai acelui obiect: its scară , este poziţie , si este orientare . Le puteți accesa dintr-un script ca acesta:

transform.position = newPositionVector3;
transform.rotation = newRotationQuaternion;
transform.localScale = newScaleVector3;

În exemplele de mai sus, variabilele numite sunt de tipul specificat în nume. Există câteva detalii cheie aici: poziția și scara sunt, așa cum vă așteptați, stocate ca Vector3s . Puteți accesa fișierul X , ȘI , și CU componentele fiecăruia (de exemplu, transformă.poziție.y vă oferă distanța unui obiect deasupra planului zero).

Cu toate acestea, pentru a evita blocare cardanică , rotațiile sunt tratate ca Cuaternionii (vectori cu patru componente). Deoarece cuaternionii de manipulare manuală nu sunt intuitivi, puteți manipula rotațiile folosind unghiurile euleriene folosind Cuaternion.Euler metoda de acest fel:

transform.rotation = Quaternion.Euler(pitch, yaw, roll);

Dacă doriți să mutați obiecte fără probleme dintr-un loc în altul, veți găsi Slerp utilă pentru cuaternioni și vector3s. Slerp ia trei argumente - starea actuală, starea finală și viteza de schimbare și interpolează ușor între ele la viteza dată. Sintaxa arată astfel:

transform.position = Vector3.Slerp(startPositionVector3, newDestinationVector3, 1);

6.2 Renderer

Funcțiile de redare din Unity vă permit să controlați modul în care suprafețele de recuzită sunt redate pe ecran. Puteți reatribui textura, puteți schimba culoarea și puteți modifica nuanța și vizibilitatea obiectului. Sintaxa arată astfel:

renderer.enabled = false;
renderer.material.color = new Color(0, 255, 0);
renderer.material.mainTexture = myTexture;
renderer.material.shader = newShader;

Cele mai multe dintre acestea au funcții destul de clare. Primul exemplu face obiectul în cauză invizibil: un truc util în mai multe situații. Al doilea exemplu atribuie un nou Culoare RGB (și anume, verde) obiectului în cauză. Al treilea atribuie textura principală difuză unei noi variabile Textură. Ultimul exemplu schimbă nuanța materialului obiectului într-o variabilă de nuanțe nou definită.

6.3 Fizică

Unity vine cu un motor de fizică integrat - ceva pe care îl folosesc toate jocurile de sandbox pentru fizică. Acest lucru vă permite să atribuiți proprietățile fizice ale obiectelor și să permiteți detaliile simulării lor să fie gestionate pentru dvs. În general, mai degrabă decât să încerci să îți implementezi propria fizică folosind un manual și sistemul de transformare, este mai simplu și mai robust să folosești motorul de fizică al Unity în cea mai mare măsură posibilă.

Toate recuzita fizică necesită ciocnitori . Cu toate acestea, simularea propriu-zisă este gestionată de un corp rigid , care poate fi adăugat în inspector vedere. Corpurile rigide pot fi cinematic sau noncinematic .

Recuzita fizică cinematică se ciocnește cu (și realizează) recuzita fizică necinematică din jurul lor, dar nu este afectată de coliziune. Recuzitele cinematice statice sunt obiecte imovabile proverbiale, iar obiectele cinematice în mișcare sunt forța proverbială de neoprit (pentru înregistrare, atunci când se ciocnesc, ele trec pur și simplu una prin cealaltă).

Dincolo de aceasta, puteți regla tracțiunea unghiulară a obiectului (câtă energie este necesară pentru a-l roti), puteți schimba masa, puteți dicta dacă este sau nu afectată de gravitație și puteți aplica forțe asupra acestuia.

Exemple:

rigidbody.angularDrag = 0.1f;
rigidbody.mass = 100;
rigidbody.isKinematic = false;
rigidbody.useGravity = true;
rigidbody.AddForce(transform.forward * 100);

Toate acestea se explică de la sine. Singurul lucru de remarcat aici este utilizarea transforma.înainte . Vector3 are toate trei componente ( .redirecţiona , .sus , și .dreapta ) asociate cu acestea, care pot fi accesate și se rotesc cu ele ( redirecţiona este direcția săgeții albastre din editor). The transforma.înainte cuvântul cheie este pur și simplu vectorul înainte pentru obiectul curent cu magnitudinea 1. Poate fi multiplicat cu un flotor pentru a crea mai multă forță asupra obiectului. De asemenea, puteți face referință transforma.up și transforma.drept , și negați-le pentru a obține inversurile lor.

6.4 Coliziune

Adesea, atunci când construiești un joc, ai vrea ca o coliziune să conducă la o schimbare de stare în codul tău, dincolo de simpla simulare fizică. Pentru aceasta, veți avea nevoie de un metoda de detectare a coliziunilor .

Există o anumită cantitate de muncă de pregătire necesară pentru a detecta coliziunile în Unity. În primul rând, cel puțin unul dintre obiectele din coliziune are nevoie de un corp rigid non-cinematic atașat de acesta. Ambele obiecte trebuie să aibă colizori corecți, setați să nu fie declanșatori. Viteza totală a ambelor obiecte trebuie să fie suficient de mică încât să se ciocnească, în loc să sară pur și simplu unul peste altul.

Dacă aveți grijă de toate acestea, puteți verifica coliziunea plasând o metodă specială de detectare a coliziunii într-un script atașat obiectului cu care doriți să verificați coliziunea. Metoda va arăta astfel:

void OnCollisionEnter(Collision other) {
//do things here
}

Această metodă va rula automat în timpul primului cadru pe care un alt obiect îl atinge. Entitatea de coliziune alte este o referință la obiectul pe care l-ai lovit. Puteți, de exemplu, să faceți referire la gameobject , corp rigid , și transforma caracteristici pentru a-l manipula în diferite moduri. In timp ce OnCollisionEnter este probabil cea mai comună funcție pe care o veți folosi, pe care o puteți utiliza și OnCollisionExit și OnCollisionStay (cu sintaxă și utilizare altfel identice), care se activează în timpul primului cadru care încetează să se ciocnească cu un obiect și, respectiv, în timpul fiecărui cadru în care coliziune cu un obiect, respectiv.

Uneori, poate fi util să faceți ceea ce se numește radiodifuzare . În radiodifuzare, o linie infinit de subțire (a raza ) este aruncat prin lume de la o anumită origine, de-a lungul unui vector și, atunci când lovește ceva, poziția și alte detalii ale primei coliziuni sunt returnate. Codul pentru un raycast arată astfel:

RaycastHit hit;
if (Physics.Raycast(transform.position, -Vector3.up, out hit)) {
float distanceToGround = hit.distance;
}

Aceasta aruncă o rază din poziția obiectului curent de-a lungul -Vector3.up (drept în jos) și leagă variabila lovit la primul obiect cu care se ciocnește. Odată ce raza dvs. a lovit ceva, puteți accesa lovit.distanta pentru a determina cât de departe este sau hit.GameObject pentru a manipula obiectul pe care l-ai lovit.

Raycast-urile de acest fel pot fi folosite pentru trăgători pentru a determina spre ce aruncă arma, sau pentru a selecta obiecte atunci când camera le privește sau pentru anumite stiluri de mecanic de mișcare.

6.5 Corectarea timpului

Un factor important de care trebuie să ții cont atunci când manipulezi obiecte în acest fel are de-a face cu framerate . Indiferent cât de atent optimizați, intervalele de cadre vor varia întotdeauna și nu doriți ca viteza de joc să varieze în consecință. Dacă altcineva rulează jocul dvs. pe un computer mai rapid decât l-ați dezvoltat, nu doriți ca jocul să ruleze la viteză dublă.

Modul în care corectați acest lucru este multiplicând valorile pe care le utilizați cu timpul necesar pentru a reda ultimul cadru. Acest lucru se face folosind Time.deltaTime . Acest lucru schimbă efectiv viteza oricărei variabile din care incrementați fiecare cadru schimbare pe cadru la schimbare pe secundă și, probabil, ar trebui să faceți această modificare la orice valoare pe care o creșteți sau decrementați fiecare cadru.

6.6 Surse audio și ascultători

Acum că am analizat cum să creăm, să redăm și să controlăm obiecte, să vorbim despre celălalt sens pe care îl pot servi jocurile pe computer: și anume, sunet . Unity acceptă două tipuri de sunete: 2D și 3D sunete. Sunetele 3D își variază volumul în funcție de distanță și se distorsionează pe măsură ce se deplasează în raport cu camera; Sunetele 2D nu.

Sunetele 2D sunt adecvate pentru vocile off și muzica de fundal, iar sunetele 3D se aplică sunetelor generate de evenimentele din lume. Pentru a schimba dacă un sunet este sau nu 3D, selectați-l în proiect vizualizare, comutați la inspector vizualizați și selectați opțiunea corespunzătoare din meniul derulant, apoi apăsați tasta reimporta buton.

Pentru a reda efectiv sunetul, va trebui să atașați un sursă audio la un prop (prop-ul din care doriți să provină sunetul, în cazul unui sunet 3D). Apoi va trebui să deschideți fișierul audioclip și selectați fișierul dvs. de sunet.

serviciul de profil de utilizator a eșuat la conectarea Windows 10

Poți să folosești myAudioSource.Pause () și myAudioSource.Play () pentru a controla acele fișiere de sunet. Puteți regla comportamentele de scădere, volumul și deplasarea doppler a sunetelor de sub inspector fila pentru sursa audio.

6.7 Intrare

Un joc care nu ia nicio contribuție de la utilizator nu este prea mult un joc. Există o mulțime de tipuri diferite de intrări pe care le puteți citi și aproape toate sunt accesibile prin Intrare și Cod cheie obiecte. Unele eșantioane de instrucțiuni de intrare (care au valori evaluate la fiecare cadru) sunt mai jos.

Vector3 mousePos = Input.mousePosition;
bool isLeftClicking = Input.GetMouseButton(0);
bool isPressingSpace = Input.GetKey(KeyCode.Space);

Funcțiile acestor linii sunt în mare parte explicative. Folosind aceste trei tipuri de referință de intrare, puteți reconstrui schemele de control ale celor mai moderne jocuri pe computer 3D.

6.8 Depanarea unui script

Să presupunem că un script nu funcționează. După cum spune bunul doctor, ți se pot întâmpla bangup-uri și închideri. Dacă există erori de sintaxă directe cu C #, jocul va refuza, în general, să ruleze atunci când atingeți jocul, iar unele mesaje de eroare destul de utile sunt furnizate dacă construi scripturile din editor. Vezi mai jos:

Aceste bug-uri nu sunt de obicei cele mai dificile de remediat. Ceea ce poate fi mai problematic sunt erorile semantice subtile, în care ați scris cu succes un fișier plin de C # valid - doar unul care nu face ceea ce ați crezut că ar face. Dacă aveți una dintre aceste erori și aveți probleme la depistarea acesteia, există câteva lucruri pe care le puteți încerca să îmbunătățiți situația.

Primul este să întrerupeți executarea jocului și să verificați consola. Puteți întrerupe jocul făcând clic pe pauză pictogramă din partea de sus a editorului, apoi selectând consolă din partea de jos a fereastră meniu (sau apăsând Ctrl > Schimb > C ). Chiar dacă nu există erori, avertismentele pot ajuta în continuare să ofere câteva indicii cu privire la ceea ce ar putea merge prost.

Dacă acest lucru nu funcționează, puteți încerca, de asemenea, să vă faceți o idee despre starea scriptului dvs. imprimând starea variabilelor interne pentru a confirma că programul face ceea ce credeți că face. Poți să folosești Debug.Log (String) pentru a imprima conținutul unui șir pe consolă atunci când executarea programului lovește linia respectivă. În general, dacă lucrați înapoi de la ceea ce credeți că ar trebui să se întâmple prin lucrurile care ar trebui să facă acest lucru, în cele din urmă veți ajunge la un punct în care tipăririle dvs. de depanare nu fac ceea ce vă așteptați să facă. Acolo este eroarea ta.

7. Exemplu: Scripting Pong

Pentru a construi Pong, haideți să descompunem jocul în elementele sale de bază: avem nevoie de o minge care ricoșează înainte și înapoi între palete cu o viteză crescândă, avem nevoie de un tablou de bord care să știe când bilele au trecut de palete și avem nevoie de un mecanism pentru repornirea mingii când se întâmplă asta. Un prim pas bun ar fi adăugarea unui corp rigid non-cinematic la minge, două corpuri rigide cinematice la palete, dezactivarea gravitației pentru toate și atribuirea unui material fizic adecvat din activele standard ( sări cu combina combinată setat la multiplica ).

Mai jos, puteți vizualiza scenariul balului cu comentarii explicative. Mingea trebuie să îndeplinească câteva obiective de bază: ar trebui să sară într-un model complicat, menținând întotdeauna mișcarea pe ambele axe și ar trebui să accelereze într-un ritm provocator, dar nu imposibil în direcția orizontală.

BallHandler.cs

În continuare, trebuie să ne scriptăm paddle-ul, pe care îl puteți vedea mai jos. Paleta trebuie să se miște în sus și în jos ca răspuns la apăsarea tastelor (dar nu în afara anumitor limite). De asemenea, trebuie să declanșeze sistemul de particule atunci când se ciocnește cu ceva.

PaddleHandler.cs

Apoi, avem nevoie de AI inamic: ceva care va face ca paleta inamicului să urmeze spre minge cu o rată fixă. Pentru aceasta, vom folosi Vector3.Slerp pentru o simplitate maximă. De asemenea, ne-ar plăcea același comportament al particulelor pe care îl vedem pe propria noastră paletă.

EnemyAI.cs

În cele din urmă, avem nevoie de un script pentru a actualiza tabloul de bord și pentru a reseta mingea atunci când acesta iese în afara limitelor.

ScoreboardUpdater.cs

Cu acele scripturi atașate și referințele completate, atunci când rulăm jocul nostru de Pong, experimentăm gameplay-ul!

Poti descărcați demo-ul meu Pong , dacă doriți să vedeți tot ce am subliniat în acțiune. Funcționează pe sisteme Windows, Mac și Linux.

8. Explorarea documentației / învățarea mai mult

Unity este un motor complex, cu mult mai multe caracteristici decât ar putea fi tratat în mod fiabil într-un ghid de acest stil, și asta înainte de a include o gamă largă de extensii Unity (gratuite și comerciale) disponibile pe internet. Acest ghid vă va oferi un loc puternic de pornire pentru dezvoltarea unui joc, dar autoeducarea este o abilitate importantă în orice efort, și de două ori aici.

O resursă crucială aici este Unity ScriptReference . ScriptReference este o bază de date care poate fi căutată, disponibilă atât pentru C #, cât și pentru Javascript, care are o listă cu fiecare comandă și caracteristică Unity, cu descrieri ale funcțiilor lor și exemple scurte de sintaxă.

Dacă aveți probleme cu editorul și interfața Unity, sau la fel ca preferințele tutoriale video, există o listă lungă de înaltă calitate Tutoriale video Unity disponibil. Mai extins (dar mai puțin larg) tutoriale text pentru Unity sunt disponibile și de la CatLikeCoding.

În cele din urmă, dacă aveți întrebări dincolo de sfera documentației sau tutoriale, puteți pune întrebări specifice la răspunsuri.Unity3d.com . Amintiți-vă că răspunsurile sunt oferite de voluntari, așa că respectați timpul și căutați mai întâi în baza de date pentru a vă asigura că întrebarea dvs. nu a fost deja răspunsă.

9. Construirea jocului / Compilarea cu o aplicație independentă

Când ați construit ceva de care vă mândriți (sau ați terminat de clonat exemplul nostru Pong ușor dodgy pentru practică), este timpul să vă mutați jocul din editor și să-l transformați în ceva pe care îl puteți posta pe internet și forțați prietenii și familia să se joace. Pentru a face acest lucru, va trebui să creați o aplicație independentă. Vestea bună este că în Unity, acest lucru este foarte, foarte ușor. Există, totuși, câteva potențiale sughițuri de care veți dori să fiți atenți.

Pentru început, știți că puteți construi doar un proiect fără erori. În acest scop, asigurați-vă că aveți consola deschisă pe măsură ce construiți: există câteva condiții de eroare pe care jocul le va ignora în editor, dar va întrerupe în continuare o încercare de construire. Acest lucru aruncă numai mesajele de eroare către consolă, fără rezultate vizibile pe ecran, ceea ce poate fi frustrant dacă uitați să verificați. Totuși, după ce ați compilat jocul fără erori, puteți selecta Setări de construire sub Fişier sau apăsați Ctrl > Schimb

> B . Aceasta va afișa un dialog simplu care vă permite să vă construiți jocul pentru mai multe platforme.

Procesul de acolo se explică de la sine: selectați opțiunile și apăsați construi ; jocul vă va solicita un director pe care să îl instalați și va plasa acolo directorul executabil și cel de date. Aceste două fișiere pot fi închise împreună și distribuite (asigurați-vă că nu taxați pentru un joc încorporat în demo-ul Unity, deoarece acest lucru încalcă termenii și condițiile).

10. Note de închidere

Ca și în cazul oricărui instrument de dezvoltare a jocurilor, cheia succesului cu Unity este dezvoltarea iterativă. Trebuie să construiți în trepte gestionabile - fiți ambițioși, din toate punctele de vedere, dar fiți ambițioși în bucăți mici și aranjați aceste bucăți astfel încât, chiar dacă nu ajungeți la ambiția voastră finală, veți termina cel puțin cu o coerență produs.

Obțineți cele mai importante elemente în primul rând: aveți o idee în minte produs minim viabil , cel mai simplu, cel mai simplu lucru pe care l-ai putea crea și totuși ai impresia că ai realizat ceva care merită. Accesați acel proiect minim viabil înainte de a trece la ambiții mai mari.

Acest tutorial vă oferă un loc de plecare puternic, dar cel mai bun mod de a învăța Unity este prin construirea unui joc. Începeți să construiți un joc, umpleți golurile din cunoștințele dvs. pe măsură ce acestea apar, iar fluxul treptat de cunoștințe va eroda lucrurile pe care nu le cunoașteți surprinzător de repede.

Dacă ați citit toate acestea și sunteți puțin copleșiți de codarea necesară cu Unity, asigurați-vă că verificați cum să faceți acest lucru învățați dezvoltarea jocului cu Unity Learn și, de asemenea, citiți ghidul nostru despre cum să creați jocuri video fără nicio programare.

Unity este un instrument puternic și, cu un pic de explorare, puteți construi proiecte impresionante cu el mai repede decât v-ați putea aștepta. Spuneți-ne ce ați construit în comentariile de mai jos - ne-ar plăcea să vedem!

Acțiune Acțiune Tweet E-mail 3 moduri de a verifica dacă un e-mail este real sau fals

Dacă ați primit un e-mail care arată puțin dubios, cel mai bine este întotdeauna să verificați autenticitatea acestuia. Iată trei moduri de a afla dacă un e-mail este real.

Citiți în continuare
Subiecte asemănătoare
  • Programare
  • Programare
  • Forma lungă
  • Ghid Longform
Despre autor Andre Infante(131 articole publicate)

Un scriitor și jurnalist cu sediul în sud-vest, Andre este garantat să rămână funcțional până la 50 de grade Celcius și este rezistent la apă la o adâncime de 12 metri.

Mai multe de la Andre Infante

Aboneaza-te la newsletter-ul nostru

Alăturați-vă newsletter-ului pentru sfaturi tehnice, recenzii, cărți electronice gratuite și oferte exclusive!

Faceți clic aici pentru a vă abona