martes, 30 de diciembre de 2014

Crea un videojuego con Unity3d (Programación)

Así que otra semana más a pasado...
y yo en pijama sin tener nada preparado...que bien...!!! ¬¬
Bueno, hoy toca hablar de programación o dicho de otro modo...MATEMÁTICAS!!!! 

En realidad vamos a empezar por lo más básico, ya que no quiero daros las scripts  y que vosotros las copiéis sin más, dado que así solo diríais "¡Mira! he hecho un juego" pero luego no podríais hacer ninguna variación o directamente no se podría empezar ningún otro juego, aunque sea muy básico.

Por lo tanto, lo primero que tenemos que saber es: ¿En qué lenguaje vamos a programar?  bien, pues nosotros lo haremos en C#. 
Unity3d  acepta tres lenguajes, C#, JavaScript y BOO, se dice que este último en la versión de Unity5.0 va a desaparecer por no ser demasiado usado.

Como digo, nos centraremos en C# 
Vamos a empezar con "¿Cómo crear una script en nuestro proyecto?"
Básicamente en la ventana "Project" click derecho->create y C# Script 
 Así crearemos el asset donde escribir, podemos crear previamente una carpeta y si hacemos click derecho sobre ella y el mismo método, crearemos la script dentro de dicha carpeta.
Lo más importante es que cuando hagamos el asset le demos un nombre directamente, para que unity3d no tenga luego problemas, ya que a partir de ahora trabajaremos con el MonoDevelop...una herramienta que da bastantes errores, aun que fáciles de solucionar.
Como podéis ver he puesto el nombre de "Timer", la primera con MAYÚSCULAS una norma no escrita pero fácil de cumplir. 

Dando doble click sobre lo que hemos creado, abriremos el MonoDevelop, si todo va bien allí es donde trabajaremos a continuación.

Bien, ¿por donde empezar?  quiero que veáis que (recuadro verde) ahí pone el nombre de la script que hemos creado. De ahí la importancia de no cambiar el nombre del archivo una vez creado.

Cómo podéis ver después del nombre de la Script hay una palabra algo extraña "MonoBehaviour" eso significa, a groso modo, que es un script que podemos aplicar a un objeto que tengamos en la escena.
Si no tiene esa palabra o no hereda (ya veremos más a delante que es eso) de una script con MonoBehaviour, no podremos aplicarla en un objeto de la escena.

También enseñaros que al final de la script y al lado de MonoBehaviour hay una "{" abierta y otra "}" cerrada, todo lo que haya dentro de estos corchetes será lo que hará dicha script, lo que esté fuera directamente da error o serán cosas más avanzadas que ahora no daremos.

Sigamos: 
Recuadro Azul eso lo escribí yo, ahí están declaradas 2 variables de tipo float, y diréis...¿Qué es una variable? "y float? a mi no me insultes..." 
Bien, las variables son lugares donde almacenaremos datos de todo tipo, letras, números, etc, así  muy muy muy resumido. 
El tipo float significa que serán números de tipo decimal, si quisiéramos números enteros pondríamos el tipo "int" que viene de la palabra integer,
Y si quisieramos una palabra o cadena de palabras usariamos el tipo "string".
Más adelante hablaremos de otros tipos de variables y usaremos las dos que hemos dicho.

La sintaxis es la que veis en la imagen: 
1- Si es pública, privada o de otro tipo: Nuestra variable timer (primera letra en minúscula) es pública,eso quiere decir que podemos acceder a ella desde el inspector y desde cualquier otra script, mientras que "resetTimer" al no ser pública no podremos modificar desde ningún sitio su valor.
2-Tipo de variable
3-nombre en minúsculas y sin espacios.

Recuadro Amarillo aquí vemos una "void Start(){}" eso es la sintaxis de una función  como su nombre indica hará algo en el momento que la llamemos, hay algunas que vienen por defecto y se llaman automáticamente, cómo es el caso, esta se llama nada más pulsar "Play".

Como vemos he escrito una igualdad "resetTimer = timer", 
Ahí es donde le doy el valor a la variable "resetTimer" porque si yo antes de hacer el test modifico el valor de timer por le inspector, nada más darle Play, le dará el mismo valor a la otra variable.

Ahora añadiremos un poco de código al recuadro Rojo, que como podemos ver "se ejecuta frame a frame" 
"¿Qué es un frame?"
La medida de tiempo en la que se ejecuta un render, es decir "en cada segundo puede haber una cantidad de frames que serán fotografías muy parecidas que al reproducirse una al lado de la otra harán el efecto de movimiento, algo ya hablamos en el artículo de animación

Los juegos de nextGen van a una velocidad de 60 FPS (frames por segundo) así que lo que escribamos en este apartado se ejecutará a esa velocidad.

Una de las cosas más comunes es darse cuenta a medida que vamos escribiendo código que nos faltan cosas o no podemos hacer exactamente lo que queremos, ya que no quería mostrar los booleanos aún pero si no lo hacía así, como dije, el código que iba a mostraros se ejecutaba y no paraba en ningún momento.

¿Que es un booleano "bool"?
Es un tipo de variable (o función) que nos da un true o false: o SI o NO.
En este caso hemos dicho que la variable "end" se inicie en false.

Sigamos con 
Recuadro Rojo
lo que tenemos ahí son condiciones dentro de la función, así que podemos leer "Si end es falso (!end)" entonces "{" hazme lo siguiente:
el valor de time, me lo restarás cada segundo "time -= Time.deltaTime", esta expresión significa que el valor time, se le resta el valor que tiene en ese momento menos la porción de segundo corrido, así tendremos un cronometro que irá hacia atrás.
Dentro de la condición tenemos otra (se pueden anidar una dentro de otra hasta el infinito, lo que cada vez consumirá un poco más).
En la cual decimos "si el valor de time llaga a cero o inferior "timer <=0" entonces { hazme lo siguiente:
Escríbeme en consola "the end"--> Debug.Log ("the end"), lo que pongamos entre comillas dentro de los parentesis en esta propiedad, se escribirá en la consola, que veremos a continuación.
Después de escribirlo, hazme que el timer vuelva al valor que tenia al principio--> timer = resetTimer
de ahí que al principio le diéramos un valor a resetTimer.
y una vez hecho esto, me pones la variable "end" a true --> end = true

TODAS LAS "FRASES" DEBEN ACABAR CON ";"(punto y coma) a no ser que tengan [] o {} y algunas excepciones más.
(tranquilos que si lo tenéis que poner la consola os dará error si no lo has puesto).
al acabar la condición cerramos y ponemos } por cada uno de los abiertos.

Como ahora la variable end está a true, no vuelve a entrar en la condición y no se volverá a ejecutar esta parte del código hasta que no se ponga de nuevo a false.
Si queremos comprobarlo solo tenemos que hacer la variable publica para verla en el inspector.

Para finalizar: 
Volvamos a Unity3d---> arrastramos la script a un objeto que esté en el proyecto (en este caso en la cámara) y vemos como aparece en el inspector del objeto como un nuevo componente.
Ahí también vemos las variables que hemos declarado como públicas con el valor que le hemos dado, pudiendo modificar dicho valor cuando queramos. 
La consola está en ese recuadro verde (si no la tenemos en pantalla podemos ir al menú Window y ahí la encontramos, podemos situarla donde queramos.
Ahora solo hace falta darle a PLAY  y ver como la variable baja hasta el 0, imprime en la consola "the end" y se pone en true el booleano, para ver si funciona todo volveremos a destildar (sin salir del play) el booleano y veremos como vuelve a hacer lo mismo ya que entra de nuevo en la condición que dijimos.

Espero que no se os haya hecho muy pesado xD esto solo es el principio y pensar...ya tenemos un cronometro para nuestro juego!!!!.

A ver quien se apunta a seguir en esto hasta el final!!!
Que tengan buena semana!!!
Nos vamos "viendo".


No hay comentarios:

Publicar un comentario