În acest tutorial, veți învăța cum să creați un joc 2D folosind C # și Unity. Vom profita de sprijinul microfonului Unity pentru a îmbunătăți gameplay-ul jocului. Obiectivul jocului este simplu, ajungând pe cealaltă parte a nivelului, evitând obstacolele de-a lungul drumului. Jucătorul poate muta caracterul principal prin suflare pe microfonul dispozitivului, deplasându-l în sus.
Veți învăța următoarele aspecte ale dezvoltării jocului Unity în acest tutorial:
Deschideți Unitatea și selectați Proiect nou de la Fişier meniu pentru a deschide dialogul de proiect nou. Spuneți unității unde doriți să salvați proiectul și setațiConfigurați valorile prestabilite pentru: meniu la 2D.
În pasul următor, vă prezentați interfața de utilizator a Unity. Setați proiectul pentru platforma preferată alegând Construiți setările de la Fişier meniu și selectarea platformei țintă.
Înainte de a începe, asigurați-vă că 2D buton în Scenă panou este evidențiat. De asemenea, puteți modifica rezoluția curentă în Joc panou.
De asemenea, ar trebui să vedeți panourile de lucru ale Unity, pe care le vom folosi în acest tutorial. Ia-ți un moment pentru a explora interfața de utilizator a Unity, cum ar fi Scenă, Joc, Ierarhie, Proiect, bunuri, și Inspector. O să le folosim mult în acest tutorial.
Interfața cu utilizatorul nostru va fi simplă. Următorul ecran vă oferă o imagine a activelor pe care le vom folosi și a modului în care interfața finală de utilizator a jocului va sfârși. Puteți găsi activele pe care le vom folosi în fișierele sursă din GitHub.
Puteți folosi una dintre cele trei limbi de programare atunci când utilizați Unity, C #, UnityScript, o variantă de JavaScript și nuu. Fiecare dintre aceste limbi de programare are argumentele sale pro și contra și depinde de tine să decideți care dintre ele preferați. Preferința mea personală merge în limba de programare C # și aceasta este limba pe care o voi folosi în acest tutorial.
Dacă vă decideți să utilizați un alt limbaj de programare, asigurați-vă că ați aruncat o privire asupra exemplei Unity's Script Reference.
Înainte de a începe codificarea, trebuie să adăugăm activele proiectului Unity. Puteți face una din următoarele căi:
După finalizarea acestui pas, ar trebui să vedeți activele din proiectul dvs. bunuri dosar în Proiect panou.
Vom folosi o serie de sunete pentru a crea o experiență audio excelentă. Efectele sonore folosite în acest tutorial au fost obținute de la freesound.org.
Începeți prin tragerea și plasarea fundalului în Ierarhie panou. Ar trebui să apară în mod automat în Scenă panou.
Deoarece Scenă panoul este setat să afișeze o vizualizare 2D, veți observa că selectați Camera principală în Ierarhie arată o previzualizare a ceea ce aparatul foto va afișa. Puteți vedea, de asemenea, acest lucru în Joc vedere. Pentru a face vizibilă întreaga scenă, setați mărimea valoarea Camera principală la 4 în Inspector după cum se arată mai jos.
Vom folosi o foaie de sprite pentru elementele interfeței de utilizare a jocului nostru. Unitatea are un editor de sprite care face folosirea spritelor o briza. Lucrarea utilizată în acest tutorial a fost obținută de la openclipart.org.
Importați operele de artă, selectați-o din bunuri panou și modificați Sprite Mode opțiunea pentru Multiplu în Inspector panou.
Faceți clic pe butonul etichetat Sprite Editor și setați Tip opțiunea pentru Automat.
Cu foaia de sprite tăiată și gata de utilizare, faceți clic pe săgeata care apare atunci când este selectată foaia de sprite și alegeți sprite-ul vacăi, personajul principal al jocului nostru. Glisați-l spre scena pentru al adăuga.
Pentru a detecta coliziunile, cel puțin unul dintre obiectele de coliziune trebuie să aibă a Corpul rigid 2D componenta atașată la acesta. Pentru a adăuga unul la vacă, faceți clic pe Adăugați componenta buton în Inspector panou. Din lista de componente, selectați RigidBody 2D în Fizica 2D secțiune.
Verifică Unghiul fixat pentru a preveni rotirea vacei în cazul unei coliziuni. Nu vom folosi gravitatea fizică implicită în acest joc, ci vom simula propriul nostru. Schimba Scală gravitațională din 1 la 0 pentru a se asigura că gravitatea implicită nu afectează obiectul.
Podeaua este folosită pentru a ne menține caracterul principal, după ce am adăugat fizica la joc. Creați un nou obiect de joc selectând Creați gol de la GameObject meniul.
Pentru a face ca etajul să fie detectat atunci când caracterul îl atinge, trebuie să adăugăm a Box Collider 2D componentă. Un collider este o formă de fizică care definește zona care declanșează o coliziune.
Selectați obiectul joc de podea în Ierarhie, deschide Inspector panou și faceți clic pe Adăugați componenta. Din lista de componente, selectați Box Collider 2D în Fizica 2D secțiune.
Schimba mărimea proprietate la X: 4.8 și Y: 0,05 pentru a crea un mic dreptunghi unde va fi poziționată vaca. În cele din urmă, adăugați a Box Collider 2D la obiectul jocului de vacă prin repetarea acestor pași.
Un Sursă audio componenta este utilizată pentru a reda un clip audio atunci când playerul colectează steaua. Această componentă va citi clipul audio setat în opțiunile sale și îl va reda atunci când este sunat dintr - un script sau la început dacă Joacă pe Trezeste este selectată caseta de selectare.
Pentru a reda un sunet atunci când playerul colectează o stea, trebuie mai întâi să atașăm o stea Sursă audio componentă a acesteia. Selectați steaua din Ierarhie sau Scenă vizualiza, faceți clic pe Adăugați componenta buton în Inspector și selectați Sursă audio în Audio secțiune.
Întrucât dorim ca sunetul să se joace numai când jucătorul atinge steaua, trebuie să debifați Joacă pe Trezeste opțiune. Dați clic pe butonul mic din partea dreaptă, sub pictograma roată, pentru a selecta sunetul pe care dorim să-l jucăm.
Baloanele reprezintă viața sau sănătatea personajului nostru principal. Când o mână se ciocnește cu vaca, va apărea unul din baloane pentru a indica faptul că a fost lovit și numărul de vieți a scăzut.
Trageți sprite-ul balonului de la bunuri la Ierarhie panou și apoi înapoi la bunuri. Acest lucru va crea o prefabricat din balon. Veți observa că textul devine albastru indicând că este acum un prefabricat. Prin crearea unui prefabricat, putem reutiliza balonul fără a folosi resurse suplimentare.
Selectați noul prefabricat și apăsați Comandă + D să o duplicați. Folosește Rotație unealta pentru a roti ușor baloanele așa cum se arată în captura de ecran de mai sus.
Grupează vacă și baloane pentru a le face mai ușor să le mișcăm. Pentru aceasta, trageți un balon din Ierarhie panou și puneți-l pe partea de sus a obiectului de joc de vaca din Ierarhie panou. Obiectul jocului de vacă este evidențiat pentru a indica faptul că aruncarea balonului pe el îl va adăuga ca un copil al obiectului jocului de vaci. Rezultatul este că mișcarea obiectului jocului de vaci mută și poziția baloanelor.
Mâinile sunt dușmani sau obstacole care trebuie evitate dacă jucătorul dorește să termine nivelul prin colectarea stelei. Mâinile se mișcă dintr-o parte în alta, lăsând un gol îngust în mijloc pentru ca vaca să treacă.
Deoarece mâinile sunt obiecte de joc pe care le vom folosi de mai multe ori, mai întâi îl convertim într-un prefabricat, așa cum am făcut-o cu baloanele. Urmați pașii de mai sus pentru a crea prefabricatul și utilizați instrumentele editorului pentru a poziționa mâinile așa cum se arată în captura de ecran de mai sus.
De asemenea, trebuie să adăugăm un collitor la fiecare mână pentru a detecta coliziunile. Pentru a adăuga colizorul, faceți clic pe Adăugați componenta buton în Inspector și selectați Box Collider 2D în Fizica 2D secțiune. Veți observa că în jurul mâinii apare o casetă verde atunci când o selectați pentru a indica că mâna are un atacator legat de ea.
Suntem, de asemenea, un sunet atunci când o mână se ciocnește cu vacă, popping un balon. Pentru a realiza acest lucru, trebuie mai întâi să adăugăm sunetul. Selectați mâna din Ierarhie sau Scenă vizualiza, faceți clic pe Adăugați componenta buton în Inspector și selectați Sursă audio de la Audio secțiune.
Detaliile componentei audio vor apărea în Inspector Panel. Faceți clic pe punctul de sub pictograma roată pentru a selecta sunetul corect.
Scopul jocului este să colectezi steaua la sfârșitul fiecărui nivel. Jucătorul poate mișca vaca în sus prin suflare pe microfonul dispozitivului.
Glisați steaua din bunuri panou și adăugați-l la Scenă. În Inspector„s Transforma , modificați valorile afișate în imaginea de mai jos pentru a poziționa steaua.
Aceasta va plasa steaua în partea de sus a nivelului. Pentru a detecta momentul în care vacile colectează steaua, trebuie să adăugăm un ciocnitor la fel cum am făcut deja de câteva ori. Adauga o Box Collider 2D la stea.
Alertele sunt, de asemenea, obiecte de joc. Acestea sunt mesaje care informează jucătorul când nivelul a fost terminat sau jocul sa terminat.
Glisați alertele de la bunuri panou la Ierarhie și apoi înapoi la bunuri pentru a le converti într-o prefab. Mai târziu, în acest tutorial, vom adăuga un script la alerte și vom arăta modul în care sunt folosite. Nu uitați să le ștergeți din Scenă odată ce le-ați transformat într-un prefabricat.
Unitatea include un editor de cod, o versiune de Mono Dezvoltă. Deși este un editor bun, puteți folosi orice editor doriți. Studio vizual, de exemplu, este o alegere populară dacă utilizați Windows.
Puteți crea un fișier nou lansând editorul de cod, salvând fișierul în bunuri folder al proiectului dvs., apoi adăugați-l la un GameObject, la fel ca tu cu o componentă. Alternativ, puteți crea un nou script în Inspector prin selectarea Script nou și apoi făcând dublu clic pe ea pentru al deschide.
Pentru a ne mișca personajul principal, vom avea nevoie de acces la microfonul dispozitivului. În mod implicit, Unity oferă suport de bază pentru captarea audio, dar nu include o proprietate sau o metodă pentru detectarea nivelului de activitate al microfonului, ceea ce este ceea ce trebuie să mutați vacă.
Din fericire, putem folosi un script de terță parte care ne va permite accesul la un intensitate
proprietate. intensitate
proprietatea ne va permite, împreună cu transform.position
, pentru a muta vaca.
Creați un spațiu gol GameObject și numește-o MicrophoneInput. Folosește Adăugați componenta pentru a atașa scriptul menționat mai sus și unul Sursă audio componenta la noul obiect de joc.
Procedând astfel, activați scenariul, iar aplicația va începe să capteze intrarea microfonului. Prin ajustarea Sensibilitate proprietate în Inspector, controlam cât de mult este vacă transmisă de intrarea microfonului. Cu cât este mai mare valoarea, cu atât viteza se va mișca mai repede. Am aflat asta 50 este o valoare bună pentru a începe cu.
Următorul script definește Mână
clasa și controlează mișcarea mâinilor. Mâinile se mișcă continuu de la stânga la dreapta și invers. Să vedem cum funcționează acest lucru.
Prima proprietate pe care o folosim în scenariu este viteza de miscare
, A pluti
care definește numărul de unități pe care le mișcă o mână în timpul fiecărui cadru. Setează X
valoarea transform.position
proprietate, mutarea mâinii pe orizontală.
A doua proprietate, currentPos
, este de asemenea a pluti
și stochează poziția curentă a mâinii înainte de a se mișca. Acest lucru ne va ajuta sa calculam numarul de unitati pe care mana le poate misca.
utilizând UnityEngine; utilizând System.Collections; clasa publică Mână: MonoBehavior private float moveSpeed = 0.02f; privat float actualPos; bool public left = false;
În cele din urmă, stânga
proprietate de tip boolean
definește dacă mâna se mișcă spre stânga. Acest lucru ușurează schimbarea direcției unei mâini prin setarea stânga
variabilă la oricare dintre ele Adevărat
sau fals
.
start
metoda este o metodă definită în MonoBehaviour
clasa care se numește în timpul inițializării, înainte de a cere orice altă metodă - cu excepția Treaza
, pe care nu o vom acoperi în acest tutorial.
În start
, putem configura obiectul înainte de a executa orice alt cod. În acest caz, setăm currentPos
proprietate la poziția actuală a mâinii, înainte de a fi mutat.
void Start () currentPos = transform.position.x;
În Actualizați
, verificăm dacă mâna este la stânga sau la dreapta și o mutați în direcția corectă în fiecare cadru. Pentru a face acest lucru, vom scrie un dacă
declarație în interiorul Actualizați
și să scadă sau să crească X poziție folosind viteza de miscare
variabilă pentru a modifica poziţie
proprietate.
void Actualizare () / * Mutare mână * / / * Mutare în dreapta dacă mâna este în partea stângă * / if (! stânga) transform.position - = Vector3 nou (moveSpeed, 0, 0); altceva transform.position + = Vector3 nou (moveSpeed, 0, 0); / * Schimba moveSpeed pentru a muta în cealaltă direcție, creând o buclă de mișcare * / if (transform.position.x <= currentPos - 0.7f) moveSpeed *= -1; if (transform.position.x >= actualPos + 0.7f) moveSpeed * = -1;
Când mâna se mișcă 0.7
unități, înmulțim viteza de miscare
proprietate de către -1
pentru a face mâna să se miște în direcția opusă. Rezultatul este că mâinile se deplasează dintr-o parte în alta într-o buclă continuă, ceea ce face mai greu ca vaca să treacă prin mâini și să ajungă la stea.
Creați un script nou și atașați-l la obiectul jocului vacă. Acest script va gestiona acțiunile jucătorului și alte câteva funcții legate de mecanica jocului, cum ar fi afișarea alertelor. Să aruncăm o privire la proprietățile folosite în acest script.
utilizând UnityEngine; utilizând System.Collections; clasa publica Cow: MonoBehavior privat Vector3 gravitate = Vector3 nou (0, 0.02f, 0); public GameObject micVolume; privat float moveSpeed; private byte balloons = 3; public GameObject alertWin; public GameObject alertLose;
gravitatie
: utilizat pentru a simula o forță verticală, trage vacile în josmicVolume
: trimitere la MicrophoneInput
obiect de jocviteza de miscare
: devine intensitate
valoare de la MicrophoneInput
clasăbaloane
: deține numărul de baloane, această valoare reprezintă viața jucătoruluialertWin
: Trimitere la alertWin
obiect de jocalertLose
: Trimitere la alertLose
obiect de jocRețineți că variabilele publice trebuie să fie configurate în editorul Unity. Toate sunt referiri la prefabs. Setarea valorii unei variabile în editor este ușor. Salvați scriptul și asigurați-vă că nu există erori. Apoi treceți înapoi la Unity și selectați obiect de joc la care este atașat scriptul. Ar trebui să vedeți variabilele enumerate mai jos componenta script, după cum se arată mai jos.
Glisați și fixați activul dorit sau preferat la variabila sau faceți clic pe micul punct de sub pictograma roată pentru ao selecta.
Asigurați-vă că activul și variabila sunt de tip acelasi tip sau nu veți putea să-l abandonați sau să-l vedeți când faceți clic pe pictograma punct.
Pentru a muta vacile în sus, vom folosi FixedUpdate
metodă. De ce nu regulate Actualizați
metodă? Această metodă este predefinită MonoBehaviour
care rulează fiecare rată fixă a cadrelor în loc de fiecare cadru. Aceasta înseamnă că va fi netedă chiar dacă rata actuală a cadrelor este puțin scăzută. Adăugați următorul bloc de cod la script:
void FixedUpdate () / * Mutare Cow în sus pe baza volumului Mic * / moveSpeed = micVolume.GetComponent() .doodness * 0.01f; transform.position = Vector3 nou (0, transform.position.y + moveSpeed, 0); / * Simulați gravitatea noastră (aceasta nu devine mai puternică atunci când este înaltă) * / transform.position - = gravitatea;
Vom calcula viteza prin obținerea luminozității curente a microfonului. Această intensitate este obținută de la MicrophoneInput
clasă și apoi înmulțită cu 0,01. Facem acest lucru pentru a împiedica vaca să se miște prea repede.
Caracterul de vacă este mutat prin mărirea y
valoarea transform.position
proprietate, utilizând viteza stocată în memoria stocată viteza de miscare
.
În plus față de mișcarea vacă, aplicăm și o forță descendentă, gravitatea. Acest lucru se realizează prin scăderea poziției vacăi utilizând gravitatie
vector creat mai devreme. Acest lucru va reduce în mod constant y
poziția vacei fără ca aceasta să scadă mai repede, ceea ce se întâmplă dacă vom folosi comportamentul gravitațional implicit.
În următorul pas, detectăm dacă una dintre mâini se ciocnește cu vacă. OnTriggerEnter2D
metoda rulează atunci când două obiecte se ciocnesc fără interacțiunea fizică. În acest caz, verificăm dacă vacile se ciocnesc cu un obiect numit "Mână"
, care poate fi oricare dintre mâinile de pe scenă și să redea sunetul atașat la obiectul jocului de vacă dacă apare coliziunea. Veți observa că verificăm și proprietatea alfa a vacii. De ce facem acest lucru este explicat în pasul următor.
void OnTriggerEnter2D (altul Collider2D) / * Hands Collision * / if (other.name == "Hand" && transform.GetComponent() .color.a == 1) other.audio.Play ();
Coliziunile sunt testate de mai multe ori în fiecare cadru, ceea ce înseamnă că trei coliziuni vor avea loc într-un timp foarte scurt, ridicând toate baloanele. Deoarece nu vrem ca acest lucru să se întâmple, avem nevoie de o modalitate de a preveni acest lucru.
O modalitate utilă de a face acest lucru este schimbarea alfa a obiectului lovit. Acest lucru va da utilizatorilor feedback vizual care indică faptul că au fost lovite. Următoarele linii vor avea grijă de asta.
/ * Prevenirea coliziunii multiple * / Culoare alfa = culoare nouă (1, 1, 1, 0.5f); transform.GetComponent() .color = alfa; Invocați ("EnableCollision", 1);
Mai întâi creăm un nou Culoare
obiecte și alocați-i culoarea obiectului de joc și setați-l alfa
valoare pentru 0.5
pentru a deveni semi-transparent. Apoi, accesăm obiectul jocului SpriteRenderer
, care ne permite să-i modificăm culoarea.
Ultima linie din acest bloc de cod așteaptă o secundă și apoi o apelează EnableCollision
funcţie. Această funcție reinițializează valorile culorilor vacăi, făcând din nou posibilitatea de a detecta o coliziune. Vom implementa această funcție mai târziu în acest tutorial.
Când vaca este lovită de o mână, un balon trebuie eliminat. Noi numim Distruge
metoda pe un obiect de balon. Noi folosim Găsi
pentru că nu avem o referință la fiecare dintre baloane.
Această funcție caută activele jocului și returnează obiectul de joc pe care îl căutăm, în acest caz un balon.
/ * Eliminați balonul * / Distrugeți (GameObject.Find ("Balon")); balloons--;
Dar așteptați, nu sunt trei baloane în scenă? Este corect. Însă Găsi
funcția returnează primul meci pe care îl poate găsi. Cu alte cuvinte, returnează primul obiect de balon pe care îl găsește.
De asemenea, decrementăm baloane
contra pentru a ne ajuta să știm când vaca și-a pierdut toată viața.
Jocul sa terminat când toate baloanele au fost aruncate. Pentru a testa acest lucru, verificăm dacă baloane
este egal cu 0
și afișați o alertă dacă este adevărată. Am setat și gravitatie
„s y
proprietate la 0
și întrerupeți jocul prin setarea Grafic de timp
la 0
.
Grafic de timp
proprietatea controlează timpul petrecut în mediul de joc. Acesta poate fi folosit pentru a face jocul mai rapid sau mai lent pe baza valorii sale. Scala de timp implicită este 1.0
, creșterea valorii acesteia accelerează funcțiile asociate ratei de cadre și le diminuează încetinirea. Setarea la 0
întrerupe jocul, împiedicând orice noi ciocniri.
/ * Joc peste * / if (baloane == 0) GameObject alert = Instantiate (alertLose, new Vector3 (0, 0, 0), transform.rotation) ca GameObject; gravitatea.y = 0; Time.timeScale = 0;
Când jucătorul ajunge pe cealaltă parte a nivelului, trebuie să scoatem steaua și să afișăm o alertă care indică faptul că nivelul a fost terminat.
dacă
declarația verifică dacă coliziunea este în realitate cu obiectul jocului stea și redă audio atașat la vacă dacă numele este corect. Apoi scoatem steaua din scenă înainte de a crea alerta. Am setat și gravitatie
„s y
proprietate la 0
așa cum am făcut în pasul anterior.
/ * Star Collision * / dacă (other.name == "Star") audio.Play (); Distruge (other.gameObject); GameObject alert = Instantiate (alertWin, noul Vector3 (0, 0, 0), transform.rotation) ca GameObject; gravitatea.y = 0;
EnableCollision
metoda resetează valoarea alfa a obiectului de joc de vaca după ce a fost lovită de o mână. Acest lucru va permite obiectului joc de vacă să detecteze un alt hit. Rețineți că Culoare
obiect are un alfa
de 1
.
void EnableCollision () Culoare alfa = culoare nouă (1, 1, 1, 1); transform.GetComponent() .color = alfa;
Reîncarcă
utilizează metoda cerere
pentru a reîncărca nivelul actual. Creați un script nou numit Repornire , adăugați următorul bloc de coduri și atașați-l la ambele prefabricate de alertă create mai devreme.
utilizând UnityEngine; utilizând System.Collections; public class Restart: MonoBehour void Update () if (Input.GetButton ("Fire1")) Reîncărcare (); void Reîncărcare () Application.LoadLevel (Application.loadedLevel);
Încercăm mai întâi dacă robotul apasă pe ecran folosind Intrare
clasați și apelați Reîncarcă
dacă este adevărat. Punerea în aplicare a directivei Reîncarcă
metoda este scurtă și simplă. Tot ce facem este să încărcăm nivelul curent, resetând fiecare obiect și variabilă la starea inițială.
Este timpul să testați jocul. presa Command-P pentru a juca jocul în Unitate. Dacă totul funcționează conform așteptărilor, sunteți pregătiți pentru pașii finali.
Când sunteți mulțumit de jocul dvs., este timpul să selectați Construiți setările de la Fişier meniu și faceți clic pe Setările playerului buton. Acest lucru ar trebui să aducă Setările playerului în Inspector panou în care puteți seta parametrii pentru aplicația dvs..
Aceste setări sunt specifice aplicației și includ creatorul sau compania, rezoluția aplicației, modul de afișare etc. Aceste setări depind de dispozitivele pe care le vizați și de magazinele sau piețele pe care le veți publica pe.
Odată ce proiectul dvs. este configurat corect, este timpul să revizuiți Construiți setările și faceți clic pe Construi buton. Asta e tot ce este nevoie pentru a vă construi jocul pentru testare și / sau distribuție.
În acest tutorial, am învățat cum să implementăm comenzile microfonului, interacțiunea cu fizica, foile de sprite și alte aspecte ale dezvoltării jocurilor folosind Unity. Vă încurajez să experimentați rezultatul și să personalizați jocul pentru a-l creați. Sper că ți-a plăcut acest tutorial și l-am găsit de ajutor.