Cum se creează un joc Android de bază cu Unity

în acest tutorial similar, vom analiza cum să creăm un element de bază Android joc folosind Unity.



Cerințe:

  • Unitate
  • Un editor de text bun, cum ar fi NotePad ++ (opțional, dar recomandat)
  • SDK Android
Dacă nu îl aveți deja, ar trebui să începeți prin descărcarea și instalarea Unity SDK și, de asemenea, Android SDK. Avem nevoie de SDK-ul Android, astfel încât să putem testa APK-ul jocului într-un mediu Android.

Lansați Unity și creați un nou proiect. Faceți-l un proiect 2D.



Există mai multe panouri cu care să vă familiarizați - panoul Ierarhie, care va conține toate elementele scenei noastre (scenă = orice „nivel” la care lucrați în prezent). Apoi, există fila Joc care este utilizată pentru a vă juca / testa jocul în timp ce vă aflați în editor, iar în dreapta aveți panoul Inspector, unde puteți edita diverse lucruri, cum ar fi iluminatul, fizica etc.



Primul lucru pe care vrem să-l facem este să creăm un sprite - acesta va fi personajul nostru principal (pe care îl controlăm). Puteți fie să vă desenați propriul sprite, cum ar fi doar să desenați un pătrat cu ochi, fie puteți să luați un sprite de pe internet - asigurați-vă că este un fișier .PNG (fundal transparent).



Glisați și fixați sprite-ul pe fereastra principală a scenei (cea mai mare fereastră) - va apărea și în panoul Ierarhia din stânga.

Așa că acum vom crea câteva platforme - acestea pot fi pătrate simple, pentru că le vom putea redimensiona cu ușurință pentru a crea pereți și alte platforme.

Deci, creați un nou „sprite” pătrat și trageți-l și fixați-l pe fereastra Scene, așa cum ați făcut cu personajul sprite.



Acum trebuie să instruim Unity să dea fizică personajului nostru principal - faceți clic pe personajul principal sprite (acesta ar trebui să fie evidențiat în albastru în fereastra Scene), apoi pe panoul Inspector, căutați „GameObjects”.

Faceți clic pe „Adăugare componentă> Fizică 2D> RigidBody2D”. Acest lucru va adăuga automat fizică la sprite-ul dvs., pe care altfel ar fi trebuit să îl creați în alt SDK.

Vrem să împiedicăm ca personajul sprite principal să se învârtă în afara controlului - deci găsiți fila Constraints din panoul Inspector (cu sprite-ul principal evidențiat în fereastra Scene) și bifați caseta pentru „Freeze Rotation Z”.

Dacă apeși pe butonul „Joacă”, personajul tău principal sprite ar trebui să cadă din cer și să cadă la nesfârșit - vom avea grijă de asta mai târziu, dar ia act doar de modul în care am reușit cu ușurință să aplicăm fizica. Fizica pe care am aplicat-o depinde de forma la care se aplică - deci, dacă ați aplica aceeași fizică unei sfere, de exemplu, s-ar roti.

De asemenea, dorim să ne fixăm orientarea pentru a preveni rotirea personajului și rotirea liberă. Găsiți „constrângeri” în inspector cu jucătorul selectat și bifați caseta pentru a îngheța rotația Z. Acum faceți clic din nou pe redare și ar trebui să găsiți că jucătorul dvs. cade acum din cer în condamnarea sa infinită.

Pentru a împiedica personajul nostru principal sprite să cadă la nesfârșit, va trebui să adăugăm un colizor. Acesta este în esență doar conturul solid al unei forme pe care o vom adăuga la personajul principal sprite. Evidențiați caracterul principal sprite, faceți clic pe „Adăugare componentă> Fizică 2D> BoxCollider2D.

Acum faceți același lucru exact cu platforma pe care ați creat-o mai devreme. Personajul tău principal sprite ar trebui să „ciocnească” acum cu platforma și să rămână acolo.

Deci, acum vrem să ne asigurăm că camera va urma personajul principal sprite - în interiorul scenei, ar trebui să existe deja un obiect al camerei. Vrei să tragi asta pe deasupra personajul principal sprite.

Acest lucru este important mai ales dacă creați un Alergător bazat pe 3D , ceva asemănător cu Pantă unde aveți nevoie ca camera să rămână constant în spatele obiectului principal de joc (personajul principal sprite).

Acum accesați panoul Ierarhie și, în lista GameObjects, doriți să trageți camera dedesubt personajul principal sprite (Player GameObject). Acest lucru va face ca personajul principal sprite să fie „ mamă' a camerei. Deci, ori de câte ori Player GameObject se deplasează pe ecran, camera ar trebui să urmeze.

Deci, pentru acest tutorial de joc, vom crea doar un joc de bază fără sfârșit, de tipul alergător, ceva de genul Rulați 3 , unde personajul tău principal va alerga pe ecran și va evita obstacolele (sau „jocul peste” dacă lovești un obstacol ”. Acest lucru va lua câteva scripturi, dintre care cele mai multe vor fi furnizate în acest ghid.

Faceți clic dreapta pe folderul „Active” și creați un folder nou - denumiți-l Scripturi . Acum faceți clic dreapta pe acest nou folder și apăsați „Creați> Script C #” și denumiți-l PlayerControls . Acest script va defini comportamentul principalului nostru personaj sprite.

Când faceți dublu clic pe acest nou script, acesta ar trebui să deschideți în Visual Studio - alternativ (și preferința mea personală), îl puteți edita în ceva de genul NotePad ++.

Fișierul script ar trebui să aibă deja un pic de cod „placă de cazan” în interior - practic acesta este un script care trebuie lăsat singur sau doar adaptat la nevoile dvs. și ne va economisi mult timp. Deci, vom adăuga un obiect nou.

Deasupra liniei nulă Start ():

public Rigidbody2D rb;

Următorul bit de cod pe care trebuie să-l adăugăm va intra în Start () și este folosit pentru a găsi corpul rigid - practic, îi instruim Unity să localizeze fizica pe care am atașat-o GameObjects (personajul nostru principal sprite) și Start () va fi executat atunci când este creat un nou obiect sau script.

Deci, apoi, localizează obiectul de fizică.

rb = GetComponent< Rigidbody2D > ();

Și veți adăuga această linie în Update ()

rb.velocity = nou Vector2 (3, rb.velocity.y);

Ceea ce face Update () este actualizarea constantă, astfel încât orice cod adăugat acolo va rula continuu (cu excepția cazului în care obiectul este distrus). Deci, ceea ce am făcut este să instruim scriptul că vrem ca rigidul să aibă un nou vector folosind aceeași viteză pe axa Y (rb.velocity.y), dar cu o viteză de 3 pe axa orizontală. În viitor, puteți utiliza și „ FixedUpdate () ” care este similar, dar diferit, deoarece acolo puteți controla cantitatea de actualizare / reîmprospătare a scriptului.

Salvați scriptul și reveniți la Unity, apoi faceți clic pe personajul principal sprite pentru a-l evidenția. În panoul Inspector, accesați Adăugare componentă> Scripturi și adăugați scriptul pe care tocmai l-am salvat. Acum, când faceți clic pe butonul Redare, personajul principal sprite ar trebui să se deplaseze continuu spre marginea platformei.

Crearea comenzilor de intrare a playerului

Deci, deoarece acesta este un joc fără sfârșit, cu obstacole, trebuie să adăugăm comenzi pentru jucător, cum ar fi un buton „salt”.

Deschideți din nou scriptul și vom adăuga acest cod suplimentar:

 dacă (Input.GetMouseButtonDown (0)) {rb.velocity = nou Vector2 (rb.velocity.x, 5); }

Vei pune asta în metoda Update () și ceea ce face practic este să spui Unity că atunci când jucătorul dă clic pe butonul mouse-ului (care va fi tradus ca o atingere pe ecran pe Android), personajul principal sprite va „sări” ' in aer. Acest lucru se datorează faptului că am adăugat o viteză pe axa Y cu o valoare de 5 (o valoare mai mare ar însemna un salt mai mare, desigur).

Dacă nu sunteți prea familiarizați cu codificarea, am folosit un Dacă afirmatie pentru ca Dacă este practic un fel de instrucțiune „faceți sau nu” - spune literal DACĂ se întâmplă acest lucru, faceți această comandă . Deci, dacă playerul nu face clic pe mouse (sau nu atinge ecranul lui Android), atunci scriptul nu va rula.

Continuați și faceți clic pe butonul „Redare” și asigurați-vă că funcționează corect înainte de a continua.

În continuare, vom adăuga obstacolele noastre (care pot „distruge” sprite-ul personajului principal), un scor de joc și un meniu „game over”.

Dacă ați testat jocul până acum, singura problemă pe care o avem până acum este că apăsarea butonului „salt” pe care l-am creat va sări personajul indiferent dacă sunt sau nu împământate - acesta este practic Flappy Birds și nu un alergător ca noi vrem. Dar vom rezolva asta.

În script, adăugați acest bit de cod de mai sus metoda Update ():

 public Transformă groundCheck; public Transformă startPosition; public   pluti groundCheckRadius; public LayerMask whatIsGround; privat   bool pe pamant; Și apoi adăugați următoarea linie la metoda de actualizare de deasupra dacă enunț: onGround = Physics2D.OverlapCircle (groundCheck.position, groundCheckRadius, whatIsGround); Și apoi veți schimba următoarea linie pentru a include „&& onGround” dacă (Input.GetMouseButtonDown (0) && onGround) {Deci, întregul nostru script ar trebui să arate în principiu astfel: public   clasă   PlayerControls : MonoBehaviour { public Rigidbody2D rb; public Transformă groundCheck; public Transformă startPosition; public   pluti groundCheckRadius; public LayerMask whatIsGround; privat   bool pe pamant; nul   start () {rb = GetComponent (); } nul   Actualizați () {rb.velocity = nou Vector2 (3, rb.velocity.y); onGround = Physics2D.OverlapCircle (groundCheck.position, groundCheckRadius, whatIsGround); dacă (Input.GetMouseButtonDown (0) && onGround) {rb.velocity = nou Vector2 (rb.velocity.x, 5); }}}

Pentru a explica ce am făcut, am creat o nouă „transformare”, ceea ce înseamnă o poziție în spațiul lumii jocului. I-am setat raza și îi instruim Unity să verifice dacă raza se suprapune cu stratul nostru de „sol” - și astfel, dacă raza noastră este sincronizată cu „solul”, personajul nostru ar trebui să poată sări și dacă Suntem deja în aer dintr-un salt, nu ar trebui să putem sări din nou. Pe scurt, pe pamant va fi adevărat dacă transformarea numită groundCheck se suprapune cu stratul de sol. Sperăm că asta are sens.

Așadar, salvați scriptul și reveniți la Unity și veți observa că au fost adăugate mai multe opțiuni la Inspector după ce ați evidențiat playerul. Acestea sunt variabile publice și le putem regla după bunul nostru plac.

Acum faceți clic dreapta pe Ierarhie și creați un nou obiect gol și trageți-l astfel încât să fie sub sprite-ul caracterului principal în fereastra Scenei principale - poziționați acest obiect gol unde dorim să fie detectat podeaua. Redenumiți obiectul în „Check Ground”, apoi trageți-l sub obiectul jocului jucătorului așa cum am făcut mai devreme cu camera (pentru a crea o relație părinte-copil între obiecte). Acum, obiectul gol va urma sprite-ul personajului principal, la fel ca camera, și va verifica continuu distanța de podea

Acum selectați sprite-ul personajului principal și mergeți la panoul Inspector - trageți obiectul Check Ground în spațiul numit „groundCheck”. Poziția de „transformare” ar trebui să fie egală cu poziția acestui nou obiect și, în cazul în care scrie „Rază”, faceți-l 0,1.

Trebuie să definim stratul de sol. Trebuie doar să selectați terenul și, în Inspector, găsiți butonul pentru „Layer: implicit” (este o casetă derulantă) și alegeți „Add Layer”.

Acum selectați „sol” ca strat pentru platforma noastră și repetați acest lucru pentru orice alte platforme din fereastra jocului. Unde scrie „Ce este solul” pe obiectul sprite al personajului nostru principal, selectați și stratul de sol.

Ceea ce am făcut este să instruim scriptul playerului să efectueze o verificare - dacă punctul mic de pe ecran se suprapune cu orice se potrivește cu stratul, personajul va sări doar dacă acest lucru este adevărat.

Game Over on Collision și Game Menu

Deci, pentru a încheia totul, ultimele lucruri pe care vrem să le facem sunt A: Făcând coliziunea cu obstacolele să se finalizeze un joc și B: Creați un ecran de meniu „joc peste” cu un buton de redare din nou.

Ceea ce doriți practic să faceți este:

  1. Adauga o Jucător obiect și atribuie un corp rigid și a ciocnitor la alegerea ta.
  2. Adăugați un Dusman obiect și atribuie un corp rigid și a ciocnitor din alegerea ta. (și opțional, adăugați Etichetă „dușman” la el)
  3. Creaza un nou Script C # și adăugați-l ca o componentă la Jucător (sau utilizați orice script atașat playerului, nu este nevoie să creați unul nou dacă aveți deja unul)
  4. Adăugați acest lucru în script:
nul OnCollisionEnter ( Coliziune col) { Depanare . Buturuga ('Coliziune'); // Verificați dacă înregistrează chiar o coliziune, dacă funcționează puteți elimina această linie if (col.gameobject. etichetă == „Inamic”) { // vede dacă obiectul cu care jucătorul tău s-a ciocnit are o etichetă numită „Inamic