Usuari/a: -- Sortir --

Unity: programació de videojoc bàsica en C #

Requisits minims

Tenir alguna versió d'Unity instal·lada.

Crear i aplicar scripts:

Si volem programar en Unity necessitem crear scripts que són unitats de codi que realitzen una missió, per això donem clic dret sobre la carpeta per defecte baix a l'esquerra Assets, Create, Folder, i l'anomenem Scripts:

Hauria de quedar com:

Ara que tenim una carpeta a on organitzar tots els nostres scripts creiem alguns d'aquests, botó dret dins de la carpeta de Scripts, create, C # script:

Li podem donar un nom, com és un exemple posem -ExampleScript:

Si premem doble clic sobre l'script se'ns obrirà en un editor de text. El primer que és bo saber és què vol dir NomScript: MonoBehaviour. Bé MonoBehaviour és una classe de la qual hereta el nostre script i això ens permet comunicar-li a Unity: vull que el meu script sigui usat dins dels objectes del joc, val?.

Aprenem com crear un objecte de joc o GameObject en anglès. Per això tornem a Unity, a dalt a l'esquerra a Hierarchy cliquem a create, 3d object, capsule:

Fem clic esquerre en el nostre ExampleScript i l'arrosseguem a l'objecte càpsula que acabem de crear, amb això aconseguim associar el tros de codi a l'objecte de joc:

Si el volguéssim eliminar podríem fer-ho fent clic dret sobre el títol de l'objecte i al menú clicar Remove Component:

També es pot afegir un script a un objecte clicant a Add Component, a baix a la dreta, Scripts, triem el que vulguem:

A més es pot fer de forma directa en un sol pas al crear l'script i aplicar-ho a l'objecte mitjançant Add Component, New Script, li donem el nom que vulguem:

Ens adonarem de dues coses, primer que el component, l'script, ja ens ho afegeix sota de tots els altres, a la dreta, en aquest cas l'hem anomenat Test:

Una altra qüestió és que al fer així l'script no t'ho afegeix a la carpeta actual, a Scripts, sinó que el posa a l'arrel del projecte, a Assets, és a dir, no està a l'actual:

Sinó a l'arrel:

Una cosa a tenir en compte. A mi m'agrada depurar usant prints, és a dir imprimint per pantalla el que està passant, però si tinguéssim un objecte hiper complex amb molts scripts ens convindria tenir una manera d'habilitar / deshabilitar cada script per anar comprovant que funciona bé un a un. Per a això tenim la casella de dalt a l'esquerra en cada component, que ens permet habilitar / deshabilitar cada un:

Com hem vist podem fer clic al nom del component i donar-li a remove component per esborrar-ho, o clic dret i remove component; però compte perquè l'script seguirà al nostre projecte:

Per esborrar-ho del projecte anem al panell de baix a l'esquerra, clic dret, delete, o prement el botó suprimir del teclat:

Estructura dels scripts

A continuació anem a entendre què volen dir les parts que componen un script perquè així estarem preparats per crear els comportaments que vulguem que els nostres objectes tinguin. Primer, a dalt tenim aquestes frases que comencen per using. Aquesta paraula ens permet accedir al que es diu namespaces.

Un namespace és simplement una col·lecció de classes a què es fa referència utilitzant un prefix seleccionat en el nom de la classe.

A nosaltres ens importa això per comprendre el següent: el nostre script ExampleScript està heretant de MonoBehaviour (això s'observa mitjançant ExampleScript: MonoBehaviour, els: signifiquen que el primer hereta, és fill del segon).

És a dir, nosaltres som ExampleScript i estem fent ús de coses que pertanyen a MonoBehaviour, que seria l'equivalent al nostre pare o mare. A la vida real faríem ús de la casa, i en l'script fem ús d'unes funcions ja presents com són Start () i Update ().

Per provar això comentem la línia que posa UnityEngine, els comentaris es realitzen amb // i assenyalen que aquesta línia no serà executada, és a dir, el programa la ignorarà. Seria el mateix que emancipar-nos dels nostres pares:

El que passa és que si ens emancipem dels nostres pares no podrem fer servir la seva casa, per tant aquí no podríem heretar de MonoBehaviour i per això s'assenyala subratllat en vermell com un error.

En concret si deixem el cursor sobre l'error ens ho explicarà comentant que no podem accedir a MonoBehaviour, lògic perquè hem comentat using UnityEngine i per tant hem abandonat la casa dels nostres pares:

A continuació esborrarem la // del principi de l'using que acabàvem de posar i entenguem què són les classes. Les classes són contenidors de mètodes (comportament), coses que es fan, i dades (variables), coses que es tenen:

Per exemple si volguéssim crearíem una classe Player, jugador, i els seus mètodes serien PlayerMovement, moure'l, PlayerAttack, atacar etc.

A més cal saber que el nom de la classe i el fitxer han de coincidir, en el nostre cas, a dalt, el fitxer es diu ExampleScript.cs i la class ExampleScript, això és així perquè Unity pugui saber quin arxiu del nostre ordinador conté la definició del comportament de l'objecte de joc:

Després cal tenir en compte que ja per omissió se'ns donen dos mètodes (també anomenats funcions). Start (), s'executa quan es crea l'objecte:

A més cal tenir en compte que els mètodes són trossos de codi que retornen o no, alguna cosa. És a dir, per exemple, la nostra mare ens pot trucar la qual cosa vol dir que nosaltres som el seu mètode, per recollir la nostra habitació. Després que nosaltres recollim la nostra habitació 'no li retornarem res a la nostra mare'. En el cas dels programes això s'explica mitjançant la paraula void, buit en català:

També se'ns dóna la funció Update () la qual s'executa cada vegada que s'imprimeix la pantalla, és a dir entre 30 i 60 vegades per segon:

Variables

Per començar a declarar una variable cal indicar un accés. És a dir una paraula que limiti quines classes poden utilitzar aquesta variable. Hi ha dues paraules public

O private

Public vol dir que tota classe pot accedir a aquesta variable. Private vol dir que només la classe actual ExampleScript pot usar aquesta variable.

Després seguirem amb el tipus de dada. Aquest pot ser un float:

el qual és un nombre decimal com a 0.2 o 9.7 o 3.14. un int

és un nombre sencer com 7, o 9 o 1000. Un bool

és una dada que pot contenir false o true. Segur que molts estareu pensant per què cal usar tipus de dades? Bé imaginem que tenim un pot que posa 'cogombres'. Un esperaria trobar cogombres dins. Què passa si a l'destapar trobes peix cru. Doncs que tindríem un problema. Doncs el mateix és en codi.

Seguim construint la variable. Ara cal donar-li un nom. Cal tenir en compte que el seu nom pot ser qualsevol però hem de complir una regla: el seu nom no pot ser alguna de les paraules que s'usen en el llenguatge amb un significat especial; per exemple, no podem posar-li UnityEngine, perquè hauria conflicte:

i ens donaria un error. Per exemple si volguéssim una variable per guardar la distància de l'jugador a terra la podríem anomenar isGrounded.

Cal tenir en compte que els noms de variables han de ser una única paraula, així que si volem incloure diverses, cal fer-ho com: primeraSegundaTerceraPalabra, és a dir la primera inicial en minúscules i per separar paraules indicar la inicial de cada en majúscules.

Després anem a inicialitzar el valor de la variable. Per això després el nom, posem una = i el valor. En aquest cas com el valor és decimal, separem la part exacta de la decimal amb punt i vam acabar amb f. A més la frase s'acaba amb; així:

Fins ara hem declarat una variable i inicialitzat la mateixa tot en una línia. També es pot fer en dos passos, primer declarar-la buida i després en el Start () donar-li contingut:

Amb variables tan senzilles es prefereix fer-les en línia:

Així que si premem ctrl + so file save guardem el codi.

De tornada a Unity veurem que es recarrega l'script i ens apareix en l'objecte una variable anomenada speed posada a 10. Això és perquè l'hem declarat public i accessible:

Si volguéssim podríem canviar el seu valor:

Si volguéssim tornar-li el valor original podem clicar a la rodeta dalt a la dreta, Reset:

Operadors d'assignació i aritmètica

Primer aprenguem com fer comentaris en bloc o multi-línia. Es fan mitjançant l'escriptura de / * * / Tot el que estigui dins serà ignorat pel programa. Els comentaris ens serveixen per explicar què fa el codi, són bons quan es treballa en equip.

Per exemple l'operador = s'usa per assignar el que està a la seva dreta al que es troba a la seva esquerra, en concret, en l'exemple de la variable que acabem de crear assignem un valor de 10.0 a la variable anomenada speed.

Un altre operador és el + = Significa agafa el contingut de la variable de l'esquerra i suma-li el que hagi a la dreta, és a dir, si tenim: speed = speed + i; podem escurçar l'escriptura com speed + = i;

A més també hi ha el - = que resta a l'contingut de l'esquerra el que posem a la dreta, el * = que multiplica a el contingut de l'esquerra el que tinguem a la dreta i el / = que divideix el posat a l'esquerra per l'escrit a la dreta.

Ara bé hi ha un operador curiós i rar que se sol usar anomenat mòdul. El mòdul és la resta de dividir un nombre per un altre, es denota mitjançant %

Per exemple si tenim 7% 3 que es llegeix '7 mòdul 3', el resultat serà la resta de la divisió de 7 entre 3. En contreto 7 dividit per 3 dóna 2, de la resta gener.

El resum:

Els anteriors realitzen una operació amb el valor que ja es troba a l'esquerra, però també es poden fer operacions més senzilles tipus a = b + c; és a dir on en una variable es guardi el resultat d'operar amb altres dos:

Bé, ara fem un exemple senzill d'ús del que s'ha après. Primer declararem algunes variables dins del nostre ExampleScript per sobre de l'Start ()

Com veiem tenim la speed, velocitat, distance, distància i time, temps.

Després ens agradaria fer alguna cosa com calcular la velocitat a la qual va el personatge, això és speed = distance / time;

A més perquè sigui interessant anem a imprimir per pantalla el valor que se'ns calcula, per a això fem servir la funció print () i dins dels parèntesis posem un text que vulguem entre cometes dobles

"You are travelling a:" i com volem incloure el contingut d'una variable fem servir el + que significa AGAFA'M i úneme en la frase a imprimir per pantalla amb el següent, que és el nom de la variable speed, i després un altre + i les cometes dobles per indicar la unitat de mesura "MPH" (milers per hour, milles per hora, perquè l'exemple està agafat d'un autor anglès, podríem posar "km / h quilòmetres per hora").

Li donem a ctrl so file save per guardar el codi i tornem a unity, on ens apareix el nou:

Ens pot sorprendre que el valor de speed en Unity sigui de 10, perquè en el codi l'hem canviat perquè sigui 0.0 i hem guardat. Però el guardar el codi no vol dir que es sobreescriu el d'Unity, per a això cal prémer a la rodeta dalt a la dreta i donar-li a Reset:

Ara que està tot a 0, donem-li a Play amunt en el botó de la fletxa:

I a sota a l'esquerra veurem un missatge com el següent:

  • You are travelling at NaN MPH.
  • Això es deu al fet que estem intentant dividir 0 entre 0 per això surt que la speed és NaN, not a number:

    Com volem calcular coses canviem la Distance a 100 i el Time a 1 i vegem que passa:

    Si li donem a Play i mirem a baix a l'esquerra diu:

  • You are travelling at 100 MPH.
  • Si poséssim Time a 2:

    Ens sortiria:

  • You are travelling at 50 MPH.
  • Operadors de comparació i lògica

    Per donar lògica al nostre programa necessitem comparar valors de variables mitjançant condicions. Per exemple l'operador == retorna true si el que hi ha a banda i banda és igual, i false si no:

    També tenim el complementari ! = Que significa no és igual que. Dóna true si el que hi ha a banda i banda és diferent i false si no:

    Després tenim més gran que, dóna true si el de l'esquerra té més valor que el de la dreta, menor que, major o igual que, menor mateixa manera que:

    Després tenim els operadors lògics que es fan servir per a crear comparacions / condicions complexes:

    && significa i, || és o,! és no; s'entén millor amb un exemple:

    Per exemple, normalment les condicions i comparacions es fan servir dins d'una estructura anomenada if. S'escriu: if (esCompleixCondició) { ferAlgo; }

    Si volguéssim indicar a el jugador quan està sobrepassant el límit de velocitat podem usar el següent:

    if (speed> 70 || speed <40) print ( "You are breaking the law!");

    Expressa: si la velocitat és superior a 70 o inferior a 40, posa per pantalla You are breaking the law !, tu estàs infringint la llei !.

    Guardem i tornem a Unity.

    Si a la dreta posem que viatgem Distance 100 a Time 1

    Obrim la Console, on s'imprimeixen els missatges:

    Si no la veus disponible clica al menú superior a Window -> Console.

    En concret, veiem que anem a 100 MPH per tant la nostra velocitat és> 70 i estem infringint la llei:

    Si canviéssim el time a 2, aniríem a 50 de speed i ja no infringiríem la llei:

    El motiu d'aquest comportament recordem que és la condició de dins de l'if que acabem d'escriure:

    Que expressa si la nostra velocitat speed és superior a 70 o menys que 40 infringim la llei, si no, com en aquest cas, anem a 50 simplement vam imprimir el que està fora de l'if: You are travelling at 50 MPH.

    Mètodes / Funcions

    Ara anem a aprendre què són i com es fan servir els mètodes. Els mètodes són un conjunt d'instruccions. Els mètodes són instruccions que realitzen tasques.

    Si volguéssim que la velocitat de el jugador es calculi cada vegada que premem un botó podríem començar creant un mètode per a això:

    void SpeedCheck () { }

    Recordem que void significa el tipus de dada que ens torna el mètode, en aquest cas com retorna res li posem void. SpeedCheck és el títol de l'mètode, normalment els noms de mètodes es distingeixen dels de variables posant la primera inicial també en majúscules. Els () parèntesis signifiquen que és un mètode. Les {} claus tanquen el conjunt d'instruccions que componen el nostre mètode.

    Així que ara podem agafar el codi que havíem escrit abans de seleccionar-tallar-lo i posar-lo dins del mètode:

    Guardem i tornem a Unity:

    Li donem a Play i ens adonem que no s'imprimeixen missatges a la consola:

    Això es deu al fet que abans estàvem posant tot el codi en el mètode per defecte Start () que s'executa a l'començar la vida de l'objecte de forma automàtica.

    Si volguéssim cridar a la nostra funció quan premem l'espai faríem el següent:

    És a dir dins de l'Update () el mètode que Unity s'executa cada vegada que s'imprimeix la pantalla entre 30 i 60 vegades per segon, escrivim:

    if (Input.GetKeyDown (KeyCode.Space)) {SpeedCheck ();}

    Això expressa: si pressionem de el teclat l'espai, llavors crida a la funció SpeedCheck (). Una crida a una funció és el nom de la funció amb els parèntesis ().

    Guardem i tornem a Unity.

    Si tornem a Unity i li donem a Play veurem que no s'imprimeix cap missatge, bé:

    Però si li donem a l'espai, sí:

    You are travelling at 50MPH.

    Ja amb això hem après a fer servir els mètodes i les condicions amb IFS; =).