Dezvoltați un joc inspirat de mingi de maimuță cu unitatea

Ce veți crea

Introducere

În acest tutorial, veți învăța cum să creați un joc 3D mobil utilizând C # și Unity. Obiectivul jocului este de a folosi accelerometrul pentru a muta mingea și a ajunge la portal.

Veți învăța despre următoarele aspecte ale dezvoltării jocului Unity în acest tutorial:

  • 3D Primitive
  • controalele accelerometrului
  • mișcarea camerei
  • fizică
  • GUI texturi

1. Creați un proiect de unitate nouă

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 3D.


2. Construiți setările

În pasul următor, vă prezentați interfața de utilizator a Unity. Setați proiectul pentru dezvoltarea mobilă, alegând Construiți setările de la Fişier meniu și selectarea platformei dvs. de alegere.


3. Dispozitive

Primul lucru pe care trebuie să-l facem după selectarea platformei țintă este alegerea dimensiunii operei de artă pe care o vom folosi în joc. Acest lucru ne va ajuta să selectăm o dimensiune adecvată pentru texturile 3D și pentru interfața grafică 2D, fără a face ca lucrarea să fie neclară sau să utilizeze texturi prea mari pentru dispozitivul țintă. De exemplu, operele de artă trebuie să aibă o rezoluție mai mare dacă direcționați un iPad cu un afișaj al retinei decât un Lumia 520.

iOS

  • iPad fără retină: 1024px x 768px
  • iPad cu Retina: 2048px x 1536px
  • 3.5 "iPhone / iPod Touch fără retină: 320 x 480 pixeli
  • 3.5 "iPhone / iPod cu retină: 960px x 640px
  • 4 "iPhone / iPod Touch: 1136px x 640px

Android

Deoarece Android este o platformă deschisă, există o gamă largă de dispozitive, rezoluții de ecran și densități de pixeli. Câteva dintre cele mai obișnuite sunt enumerate mai jos.

  • Tableta Asus Nexus 7: 800px x 1280px, 216 ppi
  • Motorola Droid X: 854 px × 480 px, 228 ppi
  • Samsung Galaxy SIII: 720px x 1280px, 306 ppi

Windows Phone și BlackBerry

  • Blackberry Z10: 720px x 1280px, 355 ppi
  • Nokia Lumia 520: 400px x 800px, 233 ppi
  • Nokia Lumia 1520: 1080px x 1920px, 367 ppi

Rețineți că codul pe care îl vom scrie în acest tutorial poate fi folosit pentru a viza oricare dintre platforme.


4. Export Graphics

În funcție de dispozitivele pe care le vizați, este posibil să fie necesar să convertiți opera de artă la dimensiunea și densitatea pixelilor recomandată. Puteți face acest lucru în editorul dvs. de imagine preferat. Am folosit-o Reglați dimensiunea ... funcția în cadrul Unelte în meniul OS X previzualizare cerere.


5. Interfață utilizator unitate

Puteți modifica rezoluția afișată în Joc panou.


6. Interfața jocurilor

Interfața jocului nostru va fi simplă. Imaginea de mai sus vă oferă o idee despre opera de artă pe care o vom folosi și despre cum va fi finalizată interfața finală a jocului. Puteți găsi opere de artă și resurse suplimentare în fișierele sursă ale tutorialului pe GitHub.


7. Limba de programare

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 limbaj de programare are avantajele și dezavantajele sale și depinde de tine să decideți care dintre ele preferați. Preferința mea personală este limba limbajului de programare C #, deci este limba pe care o folosesc î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.


8. Efecte de sunet

Voi folosi o serie de sunete pentru a îmbunătăți experiența audio a jocului. Efectele sonore utilizate în acest tutorial au fost obținute de la playonloop.com și Freesound.


9. Modele 3D

Pentru a ne crea jocul, trebuie mai întâi să obținem modelele noastre 3D. Vă recomandăm 3docean pentru modele de înaltă calitate, texturi și multe altele, dar dacă testați sau învățați, atunci și câteva modele gratuite sunt bune. Modelele din acest tutorial au fost descărcate de la SketchUp 3D Warehouse unde puteți găsi o varietate bună de modele de tot felul.

Acum, deoarece Unitatea nu recunoaște formatul de fișier SketchUp, trebuie să îl convertim în ceva ce poate fi importat de Unity. Mai întâi trebuie să descărcăm versiunea gratuită a SketchUp, numită SketchUp Make. 

Deschideți modelul 3D în SketchUp Faceți, selectați Export> Model 3D de la Fişier meniu și alegeți Collada (* .dae).

Alegeți un nume și o locație și faceți clic pe butonul de salvare. Acest lucru va crea un fișier și un dosar pentru modelul 3D. Fișierul deține datele pentru obiectul 3D în timp ce folderul conține texturile modelului. Apoi, puteți importa modelul în Unitate așa cum este explicat în pasul următor.


10. Importați active

Înainte de a începe codarea, trebuie să adăugăm activele noastre la proiectul Unity. Puteți face una din următoarele căi:

  • Selectați Importați un nou activ de la bunuri meniul
  • adăugați elementele în dosarul de materiale din proiect
  • trageți și plasați activele în fereastra proiectului

După finalizarea acestui pas, ar trebui să vedeți activele din proiectul dvs. bunuri dosar în Proiect panou.


11. Creați scenă

Suntem gata să creăm scena jocului prin glisarea obiectelor către Ierarhie sau Scenă panou. Vom folosi, de asemenea, obiecte primitive 3D originale Unity pentru a crea nivelul așa cum este arătat în pașii următori.

12. Configurați aparatul foto

Să ne poziționăm pe primul loc Camera principală un pic mai mare pentru a obține punctul de vedere dorit. Selectați-l din Ierarhie panou și reglați Transforma valori în Inspector pentru a se potrivi cu cele prezentate mai jos.

Nu vă faceți griji dacă nu vedeți nicio modificare. Nu am creat nimic pentru ca camera să vadă încă. Apoi, utilizați Inspector pentru a seta fundal culoarea la RGB: 0, 139, 252.

13. Context

Nivelul platformei noastre va pluti deasupra unui fundal, care va reprezenta o mare. Acesta va fi creat folosind unități primitive, un simplu Avion cu o textură aplicată.

În timp ce Unitatea poate lucra cu obiecte 3D de orice tip create de alte programe, uneori este mai ușor și / sau mai convenabil să se utilizeze primitive pentru prototipuri.

Pentru a crea marea, de exemplu, selectați Creați alte> Planuri de la GameObject și ajustați Transforma valori în Inspector pentru a se potrivi cu cele prezentate mai jos.

Ar trebui să aveți un pătrat în Scenă panou. Îl vom folosi pentru a detecta când jucătorul cade din platformă, terminând jocul.

Merită menționat faptul că aceste obiecte primitive au deja o Mesh Collider atașat la acestea, ceea ce înseamnă că acestea vor detecta automat coliziunile sau declanșează evenimente atunci când intră în contact cu o Corp rigid.

14. Materialul texturii

Pentru a aplica o textura pe planul marii, trebuie sa cream o a Material. A Material este folosit pentru a defini modul în care GameObject aspectul și este esențial să adăugați o textura unui a GameObject.

Selectați Creați> Material de la bunuri meniu pentru a crea unul, găsiți-l în bunuri panou, și utilizați Inspector pentru a selecta textura pe care doriți să o utilizați ca pe mare. Acestea sunt setările pe care le-am folosit:

Veți observa un mesaj în secțiunea material care indică faptul că este recomandat să o utilizați Mobil / Difuz ca un shader, deoarece culoarea albă implicită nu face nimic. Schimbați-l la Mobil/Difuz va ajuta, de asemenea, cu performanța.


15. Adăugarea luminii

S-ar putea să fi observat că marea este puțin mai întunecată decât ar trebui să fie. Pentru a rezolva acest lucru, trebuie să adăugăm o Ușoară la scena noastră. Selectați Creați altele de la GameObject meniu și selectați Lumină direcțională. Acest lucru va crea un obiect care produce un fascicul de lumină. Schimbă-l Transforma valorile afișate în următoarea captură de ecran pentru a ilumina marea.

Acest lucru arată mult mai bine.

16. Crearea platformelor

Platformele sunt părți ale nivelului nostru și sunt folosite de jucător pentru a muta mingea spre portalul din cealaltă parte a mării.

Creeaza o Avion așa cum ați făcut pentru mare și ajustați Transforma valori în Inspector așa cum se arată mai jos. Acest lucru va crea și pune prima platformă în loc.

Acum putem folosi Unitatea Mișcare și Rotație instrumente pentru a crea celelalte platforme. Toate acestea au aceeași dimensiune, astfel încât să le putem folosi vertical sau orizontal duplicându-le folosind Comandă + D pe OS X și Control + D pe Windows.


17. Textură platformă

Creaza un nou Material ca și noi Pasul 14 și aplicați textură în ea. Mina arată astfel:

Ajustează X și y tigla până când sunteți mulțumit de rezultat.


18. Cilindrii de frontieră

Trebuie să creăm o margine pentru a împiedica aparatul să cadă prea ușor. Pentru a face acest lucru, vom folosi un nou tip de primitiv, a Cilindru.

Selectați Creați altul> Cilindru de la GameObject și ajustați Transforma valori în Inspector așa cum se arată mai jos.

Aceasta va adăuga o margine mică la marginea primei platforme. Creaza un nou Material și să își schimbe culoarea în Inspector la RGB: 255, 69, 0.

Rezultatul ar trebui să arate astfel:

Utilizare Comandă + D (Control + D pe Windows)să duplicați frontiera și Scară instrument pentru a schimba dimensiunea sa. Poziționați duplicatele la marginile platformelor utilizând uneltele Unity.


19. Portal

Portalul este linia de poartă a jocului. Jucătorul va folosi accelerometrul pentru a controla mingea și va duce la acest punct în timp ce ridică obiecte și evită să cadă de pe platformă. Portalul este un model 3D pe care l-am importat Pasul 10.

Trageți și fixați-o pe Scenă sau Ierarhie panou și schimbați-l Transforma valorile următoare:

Aceasta o va poziționa la capătul platformelor.


20. Collider de portal

Deoarece modelele 3D importate nu au implicit un collider, trebuie să le atașăm. Deoarece trebuie doar să testați dacă mingea atinge zona albastră a portalului, vom atașa colizorul.

Aruncati o privire asupra modelului portalului din Ierarhie vizualizați și veți observa un triunghi mic în partea stângă a numelui. Dați clic pe triunghi pentru a extinde grupul portalului și selectați primul element. Am adăugat -Collider sufixul pentru clarificare.

Apasă pe Adăugați componenta buton în Inspector și alegeți Fizica> Colizorul ochiului. Aceasta va adăuga un collider utilizând forma zonei selectate a modelului.


21. Sursa audio a portalului

Pentru a oferi feedback jucătorului, vom juca un efect sonor atunci când mingea atinge colizorul portalului. Pentru că vom declanșa evenimentul utilizând colizorul creat anterior, trebuie să adăugăm sursa audio la același obiect.

Selectați-l din Ierarhie panou, faceți clic pe Adăugați componenta buton în Inspector și selectați Sursă audio de la Audio secțiune.

Debifați Joacă pe Trezeste și faceți clic pe micul punct din partea dreaptă, sub pictograma roată, pentru a selecta sunetul pe care doriți să îl redați.

22. Adăugarea insulelor

Insulele nu sunt decît elemente decorative pentru a face nivelul mai puțin gol. Am folosit un model 3D importat și un Cilindru să le facă. Nu voi intra în detaliu creând insulele, deoarece nu sunt esențiale pentru joc. Cu ceea ce ați învățat până acum, ar trebui să le puteți crea singur.


23. Adăugarea de banane

Ca și în Monkey Ball, jucătorul va putea să colecteze bananele în timpul jocului. Începeți prin tragerea modelului de la bunuri panou la Scenă. Nu vă faceți griji cu privire la locația sa încă, pentru că o vom transforma într-o prefabricat mai târziu, de vreme ce o vom reutiliza de mai multe ori.

24. Collider de ochiuri de banane

După cum am menționat mai devreme, modelele importate nu au un colizor implicit, așa că trebuie să atașăm unul la banană. Apasă pe Adăugați componenta buton în Inspector și alegeți Fizica> Colizorul ochiului. Aceasta va adăuga un collider folosind forma modelului. Asigurați-vă că verificați trăgaci , pentru că vrem să detectăm coliziuni, dar nu vrem ca mingea să reacționeze cu banana.


24. Adăugarea playerului

Este momentul să creați caracterul nostru de joc, care va fi simplu Sferă primitiv. Selectați Creați Altele> Sferă de la GameObject meniu pentru a crea primitivul și a modifica Transforma valori în Inspector așa cum se arată mai jos.

Aceasta va crea sfera și o vom poziționa la începutul nivelului nostru.

Pentru a face sfera semi-transparentă, trebuie să o schimbăm Shader Opțiuni. Deschide Inspector și schimbați shader-ul Transparent / Difuz.


25. Jucătorul RigidBody

Pentru a detecta o coliziune cu playerul, trebuie să atașăm o Corp rigid la el. Pentru a adăuga una, selectați Adăugați componenta de la Inspector panou, urmat de Fizică > Corp rigid. Puteți lăsa setările la valorile implicite.


26. Texturi GUI

Pentru a afișa interfața de utilizator a jocului, vom folosi texturile GUI ale Unity. Documentația Unity oferă o explicație clară a texturilor GUI:

GUI Texturile sunt afișate ca imagini plate în 2D. Ele sunt realizate special pentru elementele de interfață cu utilizatorul, butoanele sau decorațiile. Poziționarea și scalarea lor se realizează numai de-a lungul axelor x și y și se măsoară în coordonate de ecran, și nu în coordonate mondiale.

Implicit, imaginile importate la bunuri folderul sunt convertite în texturi care pot fi aplicate obiectelor 3D. Trebuie să schimbăm asta GUI Textura pentru imaginile pe care le dorim să le folosim în interfața de utilizator a jocului.

Selectați imaginile pe care doriți să le convertiți în bunuri și deschideți Inspector, faceți clic pe Textură tip drop-down și selectați GUI.

Acum puteți glisa și plasa imaginile în Scenă. Imaginile vor apărea întotdeauna în fața fiecărui obiect de pe scenă și vor fi tratate ca elemente 2D.

27. GUI Text

În interiorul fiecărui element GUI, vom afișa un număr care indică numărul de banane pe care le-a colectat jucătorul și timpul de plecare al jucătorului.

Selectați Creați alte> Text GUI de la GameObject pentru a crea un obiect text, așezați-l în centrul elementului GUI și modificați textul în Ierarhie panou la 0. Faceți același lucru pentru timpul din dreapta. Am setat ora implicită la 30 secunde.

Puteți utiliza un font personalizat pentru text prin adăugarea fontului la bunuri folder și apoi modificarea Font proprietatea textului în Inspector.

28. Adăugarea de scripturi

E timpul să scriem un cod. Cu interfața cu utilizatorul, putem începe să scriem codul necesar pentru a adăuga funcționalitatea jocului nostru. Noi facem asta prin intermediul unor scripturi. Scripturile sunt atașate la diferite obiecte de joc. Urmați pașii următori pentru a afla cum să adăugați interacțiunea la nivelul pe care tocmai l-am creat.


29. Mișcați scena

Vom începe prin utilizarea dispozitivului accelerometru. Mutarea playerului folosind accelerometrul este destul de simplă în Unity. Nu este nimic de creat și este ușor de înțeles.

Selectați etapa, faceți clic pe Adăugați componenta buton în Inspector și selectați Script nou. Denumiți scenariul MoveScene și nu uitați să schimbați limba în C #. Deschideți fișierul nou creat și adăugați următorul fragment de cod.

utilizând UnityEngine; utilizând System.Collections; clasa publica MoveScene: MonoBehavior void Update () transform.rotation * = Quaternion.Euler (Input.acceleration.y / 6, -Input.acceleration.x / 3, 0); 

Noi folosim Actualizați metoda de a solicita date de la accelerometru în fiecare cadru folosind Input.acceleration proprietate, care măsoară mișcarea dispozitivului într-un spațiu tridimensional. Acest lucru ne permite să obținem X, y, și z valorile și folosiți-le pentru a controla poziția jucătorului.

Apoi aplicăm valorile obținute la transform.rotation proprietatea nivelului invocând Quaternion.Euler, care returnează valorile de rotație. Rețineți că împărțim valorile accelerometrului pentru a evita ca jucătorul să se deplaseze prea repede, ceea ce face ca jocul să fie dificil.

Modificăm doar nivelurile X și y valori, pentru că avem nevoie doar de înclinare și de a nu se apropia mai mult de camera.

30. Camera urmează

Următorul script este atașat la Camera principală. Calculă spațiul dintre cameră și player și îl menține în timp ce mingea se mișcă.

utilizând UnityEngine; utilizând System.Collections; clasa publica FollowPlayer: MonoBehavior public GameObject player; player privat Vector3Offset; // Folosiți acest lucru pentru inițializare void Start () playerOffset = transform.position - player.transform.position;  // Actualizarea se numește o singură dată pentru fiecare cadru. () Transform.LookAt (player.transform); transform.position = player.transform.position + playerOffset; 

Scriptul utilizează două variabile care merită explicate:

  • jucător: Aceasta este o referință la jucătorul din Scenă. Puteți seta acest lucru în Inspector.
  • playerOffset: Aceasta este distanța dintre cameră și aparat. Deoarece ne menținem aceeași distanță între cameră și aparat, aparatul foto urmărește playerul pe măsură ce se mișcă. Decalajul este calculat în start metodă.

Direcționăm aparatul foto la player și ne fixăm poziția în poziția jucătorului la care se adauga valoarea a playerOffset. Pentru că facem asta în Actualizați metoda, poziția camerei este calculată și actualizată în fiecare cadru. Rezultatul este că aparatul foto urmărește playerul. Aceasta este o strategie simplă dar eficientă pentru a crea o cameră care urmează player-ul.

31. Colectarea de banane

Următorul script este atașat bananei și gestionează orice interacțiune cu aceasta. Începem prin a primi referințe la sunetul corespunzător și la textul care afișează numărul de banane colectate, pe care trebuie să le jucăm sunetul și să creștem contorul din stânga sus atunci când un jucător se ciocnește cu o banană. Odată ce ați declarat variabilele în script, trebuie să setați aceste referințe în Inspector.

utilizând UnityEngine; utilizând System.Collections; clasa publică PickBanana: MonoBehavior public AudioClip bananaSound; public GUIText bananaText; void OnTriggerEnter (altul Collider) AudioSource.PlayClipAtPoint (bananaSound, transform.position); int scor = int.Parse (bananaText.text) + 1; bananaText.text = scor.ToString (); Distruge (gameObject); 

Apoi, numim o metodă care detectează când mingea se ciocnește cu o banană. Când se întâmplă acest lucru, vom reda sunetul și vom mări contorul.

Pentru a modifica contorul, vom crea o variabilă folosind valoarea lui GUI Text și utilizați int.Parse metoda de a converti șirul la un număr și de a crește numărul cu 1. Apoi, setăm valoarea la GUI Text, prima conversie a numărului într-un șir prin invocarea toString metodă. În cele din urmă, invocăm Distruge pentru a elimina obiectul jocului de banane.

32. Scăderea platformei

Următoarea clasă este utilizată pentru a detecta când jucătorul cade din platformă în mare. Atașați scriptul la obiectul jocului de mare.

utilizând UnityEngine; utilizând System.Collections; clasa publică pierde: MonoBehavior void OnCollisionEnter () audio.Play (); Invocați ("Reîncărcați", 1.59f);  void Reîncărcare () Application.LoadLevel (Application.loadedLevel); 

Această clasă simplă utilizează OnCollisionEnter metoda de a detecta când mingea se ciocnește cu marea, ceea ce înseamnă că jucătorul a căzut de pe platformă. Când se întâmplă acest lucru, vom reda sunetul atașat la mare și vom folosi Invoca metoda de a apela Reîncarcă , care repornește jocul prin reîncărcarea scenei curente.

Al doilea parametru al Invoca Metoda definește întârzierea cu care Reîncarcă metoda este invocată. Acest lucru este necesar deoarece dorim ca sunetul să se termine înainte de a începe un nou joc.

33. Timpul de monitorizare

Următoarea clasă, Cronometrul, este atașat la graficul de timp din colțul din dreapta sus. Reduce timpul și încheie jocul atunci când se ajunge la contor 0.

utilizând UnityEngine; utilizând System.Collections; public class Temporizator: MonoBehavior public GUIText timeText; void Start () InvokeRepeating ("ReduceTime", 1, 1);  voidă ReduceTime () int currentTime = int.Parse (timeText.text) - 1; timeText.text = actualTime.ToString (); dacă (curentTime == 0) audio.Play (); Invocați ("Reîncărcați", 1.59f); // așteptați până când sunetul este redat pentru a reîncărca Distruge (timeText);  void Reîncărcare () Application.LoadLevel (Application.loadedLevel); 

Menținem o referință la textul din timeText variabilă pentru a ușura modificarea interfeței utilizatorului. În start metoda, numim InvokeRepeating metodă, care invocă în mod repetat ReduceTime în mod repetat.

Pentru a actualiza textul în interfața cu utilizatorul, vom crea o variabilă pentru a converti textul într-un număr, așa cum am făcut mai devreme, și să scădem o secundă și să actualizăm interfața cu rezultatul.

Când se ajunge la contor 0, este redat sunetul corespunzător și distrugem contra-textul. Invocăm Reîncarcă metoda cu o întârziere de a reporni jocul când sunetul a terminat de jucat.

34. Nivel complet

Ultima clasă, EndLevel, este utilizată pentru a detecta momentul în care jucătorul ajunge la portal. Când jucătorul trece prin portal, afișăm un mesaj pe ecran și distrugem distrugerea mingii. Facem acest lucru pentru a preveni căderea mingii în mare.

utilizând UnityEngine; utilizând System.Collections; clasa publica EndLevel: MonoBehavior public GameObject complete; jucător public GameObject; void OnTriggerEnter (alt Collider) audio.Play (); Invocați ("reporniți", 2); GameObject alert = Instantiate (completă, Vector3 nou (0.5f, 0.5f, 0), transform.rotation) ca GameObject; Distruge (player.rigidbody);  void Restart () Application.LoadLevel (Application.loadedLevel); 

instantiat metoda este utilizată pentru a crea o instanță a mesajului care este afișat pentru player. Ne permite să folosim elementul GUI din proiect bunuri în loc să o aibă pe scenă. În cele din urmă, vom reîncepe jocul cu o întârziere de două secunde.

35. Testarea

Este timpul să testați jocul. presa Comandă + P pentru a juca jocul în Unitate. Dacă totul funcționează așa cum era de așteptat, atunci sunteți pregătiți pentru pașii finali.


36. Setările playerului

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 date specifice aplicației care includ creatorul sau compania, modul de rezoluție a aplicațiilor și modul de afișare, modul de redare (CPU, GPU), compatibilitatea cu dispozitivele de sistem etc. Configurați setările în funcție de dispozitivele pe care le vizați și de magazin sau de pe piață intenționați să publicați aplicația.


37. Icoane și imagini splash

Folosind grafica pe care ați creat-o mai devreme, puteți crea acum o imagine irezistibilă și o imagine splash pentru jocul dvs. Unitatea vă arată dimensiunile necesare, care depind de platforma pe care o construiți.

38. Construiți și jucați


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.

Concluzie

În acest tutorial, am învățat cum să folosim accelerometrul pentru a controla mișcarea playerului, texturile GUI, primitivele și alte aspecte ale dezvoltării jocurilor în 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.

Cod