Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Unity en JavaScript
Unity en JavaScript
2.
3.
4.
5.
6.
7.
8.
Variables
1.1 Tipos de Variables
Funciones
2.1 Function Start
2.2 Function Update
2.3 Function OnTrigger
2.4 Function OnGUI
2.5 Function OnMouseDown
Sintaxis
Nuetro primer cdigo
Vectores
Rayos
GUI
7.1 Texturas y textos
7.2 Box y buttons
7.3 Posicionamiento
7.4 Montando un men
Empezemos nuestro juego!
8.1 Controller simple
8.2 Vida y energa
8.3 Peligros!
8.4 Items
8.5 Plataformas mbiles
8.6 Muerte
9.
8.7 Mens
8.8 Terminando
Produciendo nuestro juego
9.1 Build
9.2 Listo para entregar!
Presentacin:
Antes de empezar con el curso me gustara decir que
voy a intentar hacer este curso lo ms simple y
entendible posible, as que este curso es apto incluso
para aquellos que no saben nada de programacin. Si
ya tienes conocimientos previos te aconsejo pasar
directamente al apartado 4 (Nuestro primer cdigo),
aunque deberas hechar un vistazo al apartado 2:
Funciones, para aprender las funciones bsicas de
Unity.
Gracias por leerlo y espero que os sea til este curso.
____________________________________________
_______
1.
Variables
En ocasiones el concepto de variables puede ser difcil de entender, as
que en mi opinin dejemonos de conceptos y explicaciones tcnicas y
vamos a explicar que son las variables de una forma ms sencilla.
2 - Float
Bueno, con esta terminar rpido dado que es lo mismo que la anterior
pero con decimales. Ej: -1.243, 0.535, 7.368
3 - Boolean
Una boolean es una variable que solo puede tener dos valores, llmalos
como quieras: 0 y 1 / verdadero o falso / esto o aquello
En la programacin se escribe que es true o false. (verdadero o falso)
Se suelen usar para poner condiciones. Ejemplo, en un juego de disparos
quieres disparar solo si tienes balas (lgico), si no tienes balas no. Pues
creas una variable BOOLEAN que se llame... "poder_disparar".
Primero: si "poder_disparar" es verdad ------ disparas
Luego: si "municin" es mayor que 0 -------- "poder_disparar" es verdad
si "municin" es 0 o menos ------------- "poder_disparar" es mentira
Te lo dejo en script si no te ha quedado claro:
4 - Double
Estas no las gastaremos. Las double son como las int pero aceptan
valores ms grandes, explico: las int, solo llegan hasta 32767.
Las int van de -32767 a 32767:
VARIABLES DE UNITY
A partir de aqu nombraremos algunas de las variables ms usadas de la
librera de unity (eso quiere decir que estas variables solo sirven si
programas en unity)
1 - GameObject
Pues esto es simplemente un objeto, cualquier cosa que tengas en la
escena: un cubo, una esfera, la cmara, el player, un modelo, un sonido,
etc.
Puede ser un objeto de la escena o bien un prefab que tengas en project.
Normalmente se asignan en el inspector, pero algunas veces puedes
asignarlas desde el script.
2 Vector
De estos ya hablaremos ms tarde que son ms complicados.
var posi : Vector3
3 Texture2D
Son como el GameObject pero este es una Textura, no un objeto.
2.
FUNCIONES
Las funciones son los bloques dentro de los cuales estn los comandos.
Todo efecto que hace un script (que un objeto se mueva, que te baje la
vida, etc) debe estar escrito dentro de un bloque, estos bloques son las
funciones.
Hay varios tipos de funciones, y cada una funciona de una manera
distinta, que ahora vamos a explicar.
Function Start:
La funcin start se ejecuta cuando empieza el nivel en el que ests. Cada
vez que entras en una pantalla se ejecuta el comando (el script) que haya
dentro.
Function Update
Por qu? Muy sencillo, si en Update escribes un cdigo que sirva para
disparar, por ejemplo, y no le pones la condicin de que eso pase cuando
le das al botn izquierdo del ratn, estaras siempre disparando, sin
pulsar nada dispararas siempre.
Aun as, algunas cosas como las asignaciones de valores se hacen sin
condiciones, por ejemplo, si tienes en la esquina inferior izquierda un
medidor de vida (100 HP) quieres que ese 100 cambie si te baja la vida,
si te hacen dao y tu vida baja a 56, quieres que en pantalla tambin
ponga 56, pues pondras un cdigo sin condiciones, en el que dices que
en cada momento del juego el valor que te pone en pantalla sea igual a
la variable vida.
Function OnTrigger
Habrs visto que esta vez entre los parntesis pone algo (other :
Collider), other es el objeto que choca con el que contiene el script. Si te
da igual qu objeto choque no hace falta que pongas nada, pero como en
este caso quieres especificar que sea el jugador el que entre en el cubo,
debes ponerlo.
As ves como luego ponemos como condicin que el nombre del otro
(other.name) sea "First Person Controller", eso en caso de que uses el
First Person Controller, sino aqu ira el nombre que le pongas al player.
IMPORTANTE: para que esta funcin funcione correctamente, ambos
objetos deben tener un collider, y como mnimo uno de los dos debe
tener un rigidbody puesto, si no, no detecta la collisin.
Function OnGUI
Est funcin, al igual que Update, se ejecuta durante todo el juego, pero
sta solo sirve para scripts que utilizen comandos del GUI, como GUI.Box
(que crea un recuadro en pantalla, o GUI.Button (crea un botn).
Function OnMouseDown
Es una funcin muy til. sta se ejecuta cuando pulsas encima del objeto
que lleve este script. En caso de que sea un objeto (un modelo) debe
llevar un Collider, si no lo lleva esta funcin no hace efecto, pero tambin
se puede dar el caso de que sea un GUI Texture, es decir, que con esta
funcin puedes crear botones, puedes poner en pantalla una imagen que
si le das se ejecuta un Script. Tambin existe el OnMouseUp, que es
cuando pulsas en algo, al levantar el dedo del click, de la tecla del ratn.
3.Sintaxis
Pues bien, dado que ya conoces las variables y las funciones, antes de
empezar a escribir un cdigo te explicar las normas de ortografa que
son bastante bsicas y puede que ya las conozcas. Empecemos:
1 - Declarar una variable.
A la hora de declarar una variable lo primero es escribir la palabra
clave var, seguida de el nombre de la variable (el que tu quieras), pero
recuerda que no puedes incluir espacios y que en programacin la
diferencia entre maysculas y minsculas existe. A continuacin debes
detallar el tipo de variable, con dos puntos seguido del tipo de variable:
var Nombre : int;
2 - Comentarios
En los scripts puedes incluir comentarios, que salen en color verde,
puedes ver que he incluido unos cuntos en los ejemplos anteriores de
cdigo. Los comentarios son partes omitidas del cdigo que el compilador
ignora, en pocas palabras: que no sirven para nada.
Pero lo comentarios pueden servir muchas veces, si quieres probar como
funciona un script sin una parte del cdigo (alomejor porque esa parte te
da error, o porque no te gusta...) sera muy molesto tener que borrar esa
parte del script, probarlo, y luego volverla a escribir.
Es ms fcil utilizar los comentarios para dejar una parte del script
apartada por si la quieres usar luego.
3 - Puntualizacin
Todas las lnias que contengan un comando o una declaracin deben
terminar en punto y coma (;):
declaracin: var TROF : boolean;
comando: Destroy (this.gameObject);
Todas las aperturas de funcin o condicin deben abrirse y cerrarse con {
}
if (condicin) {
}
function Update() {
}
No te olvides cuando empiezas una funcin de incluir los parentesis de los
parmetros: function Update ( ) y tampoco te olvides en la function
OnTrigger de incluir en los parametros el Collider:
function OnTriggerEnter (other:Collider)
4 - Asignacin
Esto es un fallo muy comn cuando empiezas a programar. Si en una
funcin asignas un valor a otro, Ej: municion = 30; solo se emplea un
igual, pero dentro de una condicin debes emplear dos iguales:
if ( municion == 30)
Si solo pones un igual te dar error. Tambin debes tener cuidado de no
asignarle, por ejemplo, un valor decimal a una variable int. Si le asignas
23.45 a un integer te dar error, ya que es solo para nmeros enteros.
5 - Operadores lgicos
Esta puede ser la parte ms importante de este apartado. Los operadores
lgicos se usan en las condiciones, ahora vers:
o
o
o
o
4.
5.Vectores
Los vectores son muy importantes en la programacin sobre todo en un
entorno 3D. No sabes qu es un vector? Muy sencillo, un vector (de 3
dimensiones) consta de 3 valores: x,y, z. En caso de que fuera un vector
de 2 dimensiones tendra dos valores: x,y. Para hacerte ms fcil el
aprendizaje de los vectores yo he decido dividirlos en dos tipos: Vectores
de posicin y vectores de direccin.
-Vectores de posicin: a veces tendrs que utilizar los vectores para
indicar una posicin en el juego, un sitio de tu escena, un punto. Para
eso debers utilizar un vector con la posicin x, la posicin y, la posicin
z.
-Vectores de direccin: estos ya son ms difciles de entender. Estos se
usan cuando quieres indicar la direccin en la que se tiene que mover un
objeto. Si tu quieres que un objeto se mueva en el juego debes indicar
con un vector hacia que direccin. Pues no son coordenadas lo que tienes
que poner. En el vector de direccin solo se pone 1 o 0.
Explico: Vector (1,0,0) x = 1, y = 0, z = 0 , esto significa que se mueve
en direccin a la X. Dado que la direccin en vertical (Y) y en profundidad
(Z) es nula, se dirige a (X=1). Si no lo entiendes observa la siguiente
tabla:
USO DE VECTORES:
Para explicarlo usar el transform.position y el transform.Translate.
Transform.position es la posicin del objeto que contiene el script. Si
nosotros declaramos una variable tipo Vector: var posi : Vector3;
y luego le asignamos una posicin en el espacio a posi:
Prueba a meterle el scritp al cubo y dale al play. Ahora pulsa las teclas de
flecha arriba y flecha abajo. El cubo efectivamente se mueve pero para
mi gusto un poco demasiado deprisa as que vamos a fijarle una
velocidad.
Esto se introduce dentro de transform.Translate:
transform.Translate ( Vector3(x,y,z) * AQUI );
Y vamos a poner esto:
6.
Rayos
Los rayos son tambin una herramienta muy til, por ejemplo, los juegos
de disparos para disparar utilizan un rayo. Del arma hacia delante hay un
rayo invisible que por supuesto los jugadores no pueden ver, pero est.
Ese rayo va del arma, del punto donde disparas, hacia delante hasta que
topa con algo, as que cuando disparas es el que detecta si en disparas a
otro jugador o a una pared o lo que sea.
Pero no solo eso, sabes esos juegos de estrategia sobre construir
ciudades? Te habrs fijado que en algunos sitios te permiten construir
edificios y en otros no. Hay varias formas de hacerlo, pero una es
creando un rayo desde el ratn hacia delante, y detecta si puedes o no
construir.
Bueno, estos son solo unos ejemplos, las utilidades que le puedes dar a
los rayos son infinitas, lo que te se ocurra. Qu te parece si hacemos un
script en el cul si pasas el ratn por encima del cubo se destruye?
Creando un rayo que detecte lo que ests tocando con el ratn, y si el
objeto que tocas es el cubo lo destruye.
Habrs visto que las variables estn DENTRO de Update, no fuera. Eso
sinceramente da igual, la nica diferencia es que si est fuera se puede
usar en cualquier funcin: en Update, en Start, en OnTrigger... Pero si la
variable se declara dentro de Update, solo se puede usar en Update. Si
intentas utilizarla en otra funcin te dir que la variable no existe.
Esta condicin que hemos puesto quiere decir que el cdigo se ejecutar
si detecta colisin. Pero no nos basta con eso, nosotros queremos que el
cubo se destruya si le pasamos el ratn por encima, as que ahora
tenemos que poner como condicin que la colisin sea con el cubo.
As que ahora, dentro de la condicin ponemos esto:
if ( rayo.transform.name == this.gameObject.name)
Traduzco.
rayo.transform.name significa: "el nombre del objeto que tocamos"
this.gameObject.name significa: "el nombre de este objeto"
Por tanto la condicin es:
Si el nombre del objeto que tocamos = al nombre de este objeto....
Ponle el script al cubo, dale a Play y prueba de pasar el ratn por encima
el cubo.
Y terminamos con el apartado de los rayos! Pero antes quiero hacer una
traduccin del cdigo que acabamos de hacer por si ayuda a entenderlo:
si (el rayo choca con algo)
si (y este algo es este objeto (el cubo) )
Destruye (este objeto)
}
7.
GUI
La GUI es la interfaz, todo lo que sale en pantalla como imagen 2D, y que
no es un objeto del espacio 3D.
Como puedes ver esto es bastante fcil. Y ahora te enseo como cambiar
el texto de un GUI Text desde script, puede que te preguntes Para qu?,
si el texto ya lo puedes cambiar desde el inspector.
Pues hay variables, como la vida, la energa o la muncin que van
cambiando a lo largo del juego, entonces si creas un GUI Text para que
te lo muestre en pantalla (EJ: 100 HP), la vida no ser siempre 100, si te
baja la vida el texto tambin tiene que cambiar. Para esto en la funcin
Update escribes que el texto = HP, por tanto todo el rato, durante todo el
juego, el texto ser igual a la variable de la vida. Si la vida es 100, el text
ser 100, si la vida es 56, el text ser 56. Si ya lo tienes claro procedo a
explicarte el cdigo:
this.guiText.text // usas .text para seleccionar el texto del guiText.
= variable.ToString();
Igualarlo al nombre de la variable + .ToString()
.ToString() lo que hace es pasar el valor de numrico a texto, es decir,
HP (la variable de la vida) puede ser int o puede ser float, pero en todo
caso es un valor numrico, y tu ests intentando meter un valor numrico
en un texto, eso te dara error.
Al usar .ToString despues del nombre de la variable pasas el valor
numrico a carcteres (texto). Por tanto:
this.guiText.text = HP.ToString();
este texto = La variable HP
Prueba este script, supongo que a estas alturas ya sabr lo que hacer,
pero te lo explico. Adems de hacer que el texto que lleva este script
indique la variable HP, luego si pulsas espacio le resta 10 de vida.
Aprobecho para explicar que si quieres restar o sumar a una variable es:
variable += o -= cantidad -----------> HP += 20 (Vida + 20)
Le pones el script anterior a un GUI Text y compruebas que el texto de
convierte todo el rato en la variable HP, y si pulsas espacio la variable
cambia y el texto tambin.
La imagen tiene que ser una variable tipo texture que hayas declarado
anteriormente:var imagen : Texture; y asignada en el inspector.
7.3 Posicionamiento
Pues ahora que ya sabes crear imgenes y textos en pantalla, recuadros
y botones, te voy a ensear como colocarlos adecuadamente en pantalla,
es decir, el medidor de la salud quieres que est siempre abajo en la
esquina.
Cuando pones una imagen en pantalla, si indicas las coordenadas con
nmeros (X = 200, Y = 150) te encontrars con un problema, y es que al
cambiar la resolucin de la pantalla el icono se habr movido o ni siquiera
saldr en pantalla.
Por tanto, para posicionar una imagen en la pantalla y que siempre se
encuentre en un punto determinado de la pantalla (como es la esquina
inferior derecha) gastaremos siempre que sea
posible Screen.width y Screen.height (Ancho de pantalla y Alto de
pantalla).
Por ejemplo, creas una GUI Texture, y le pones un script para que en
todo momento esa imagen est en el centro de la pantalla. Como quieres
que est en el centro exacto de la pantalla, mi pregunta es (e intenta
pensarlo) cules sern las coordenadas X, Y?
X = Screen.width / 2 es decir: X = al ancho de la pantalla / 2
Y = Screen.height / 2 es decir: Y = al alto de la pantalla / 2
Creo que esto es fcil de entender, si divides todo lo ancho que hace tu
pantalla por la mitad, te quedas justo en el medio de la pantalla (el
centro).
3 Este es igual que el 2 solo que tiene toda la pantalla de alto, es decir,
se ha movido verticalmente, pero no horizonalmente. Sera:
X = 0 , Y = Screen.height
4 Este es el contrario del 3, toda la pantalla de ancho, pero nada de
alto:
X = Screen.width Y = 0
5 Este lo tiene todo, est al mximo de altura y ancho:
X = Screen.width Y = Screen.height
6, 7, 8, 9 Estas son esquinas visibles, es decir, no en la esquina exacta
de la pantalla, sino tocando, cerca de la esquina, pero lo que nosotros
entendemos por la esquina, que se acerca al borde de la pantalla pero no
toca. Aqu es donde pondramos los marcadores de vida, municin, etc.
Para entender lo que vamos a hacer debes entender una cosa: como ya
hemos hablado, si divides el ancho de la pantalla por la mitad, nos
quedamos en el medio de la pantalla. Y si lo dividimos entre tres? Pues
se queda a un poco menos de la mitad. Y entre 4? Pues se queda a un
cuarto (1/4) de la pantalla. Mralo aqu:
la imagen que viene junto a este tutorial en la carpeta Assets > GUI >
Button.png
Empecemos. Abre un nuevo script javascript. Primero de todo crearemos
dos funciontes: function Update y function OnGUI.
Primero de todo vamos a declarar una variable boolean (true or false)
que nos diga si el men est en pantalla o no.
var activado : boolean = false;
La igualamos a false, para que cuando empieze el juego sea falso, es
decir, no hay men en pantalla. Ahora tanto dentro de la funcin Update
como OnGUI debemos poner como condicin, que el men aparezca si
esta activado:
if (activado == true) {
// Men
}
Hasta ahora tenemos esto:
Como ves lo nico que cambia es la Y, porque los botones estn siempre
en el mismo sitio solo que cada botn ms arriba o abajo que los otros.
Bien ahora te enseo el script final, lo pruebas, y ya podemos empezar a
hacer nustro juego!
Pon este script donde quieras, asgnale las variables necesarias (la de
"boton" en la cul debes poner el prefab) y dale al play. Pulsa Z para ver
como aparece el men y X para ver como desaparece.
Aun me quedaran muchas cosas para explicar como hacer aparecer y
desaparecer el men con el mismo botn, hacer que pase algo al pulsar
los botones, o el hecho de que si pulsas varias veces Z se crea muchas
veces el men... pero para no liar ms las cosas explicar todo esto
cuando hagamos el men del juego. De momento lo bsico que es crear
GUI y posicionarlos ya lo sabes.
8.
dems est quieto, pero es que no hay nada en la escena, nada a lo que
la nave se acerce o se aleje. As que para que veas como se mueve la
nave vamos a meter otros objetos en la escena. Ya que ms tarde
tendramos que poner meteoritos, los ponemos ahora. Yo he usado este
modelo:
http://www.turbosquid.com/3d-models/asteroid-space-planet-3dsfree/616773
Turbosquid es una buena pgina para encontrar modelos para tus juegos
gratis, te la recomiendo. Pero debes registrarte para descargar cualquier
cosa.
Bien, voy a situar unos cuntos meteoritos alrededor de la nave:
}
if(Input.GetKey (KeyCode.A) || Input.GetKey (KeyCode.LeftArrow)){
transform.Translate(Vector3.left * 200 * Time.deltaTime);
}
if(Input.GetKey (KeyCode.D) || Input.GetKey (KeyCode.RightArrow)){
transform.Translate(Vector3.right * 200 * Time.deltaTime);
}
Primero de todo creamos un script que se llame como tu quieras, yo lo llamar... HP. En Hp crearemos dos
variables: vida y energa, tipo float que en inicio sern 100.
Ahora deberamos hacer que nos salga en pantalla. Hay varias formas de hacerlo, la que he usado yo es la
siguiente. Con estas texturas:
Esto funciona as: las barras llenas van encima de las vacas. La longitud de las llenas depende de la salud y la
energa. Si la vida baja, la barra roja se empieza a hacer ms estrecha y se ver como resultado el blanco de
abajo, haciendo el efecto de una barra de vida que se agota, ya vers.
Puedes cogerlas con guardar como. Lo que he hecho es crear 4 GUI Textures con estas texturas. Las he
puesto todas dentro de un objeto vaco, llmalo como quieras EJ: "GUI Bars". Y le he aplicado a este objeto
vaco, un script que te voy a explicar ahora.
En primer lugar debemos hacer que estas barras se coloquen en la posicin que queremos con el tamao que
queremos. Si has creado las GUI textures te deberan salir en pantalla, para que no te molesten simplemente
el objeto vaco (GUI Bars) muevelo hacia un lado y las texturas desaparecern de la pantalla. Tranquilo que en
el juego te saldrn en pantalla, pero mientras no hace falta.
As que creamos un nuevo script, ponle un nombre. Debemos crear las variables de las barras, as que crea
cuatro variables tipo GameObject:
HPbar : GameObject;
HPback : GameObject;
SPbar : GameObject;
SPback : GameObject;
Luego en el inspector le asignas en HPbar la barra roja entera desde Hierarchy, y en HPback la barra roja con
el espacio blanco. Lo mismo con SP y la barra azul.
A ver, lo primero es el nombre del objeto al que te refieres. HPbar es la barra de la salud, la variable que
hemos creado anteriormente. Si te quisieras referir al propio objeto que lleva el script sera this.gameObject.
Luego, con guiTexture nos referimos a la guiTexture que contiene ese objeto. Nosotros hemos asignado al
objeto HPbar el objeto que hemos creado, y dentro de ese objeto hay una GUI Texture, donde se encuentra la
textura, la imagen de la barra. A continuacin, con pixelInset hablamos de las coordenadas y tamao de la
textura. La traduccin sera:
Y ahora le asignamos una posicin y tamao. X, Y son las coordenadas de la pantalla. Qu coordenadas? Esto
siempre, cuando vayas a hacer cualquier juego debes pensarlo segn la lgica. Considera que el punto origen,
las coordenadas (0,0) estn en la esquina inferior izquierda. Yo, en mi caso, he colocado las barras arriba a la
izquierda, esquina superior izquierda. Para eso, primero vamos a la X. La barra no tiene que estar tocando al
borde de la pantalla, no la queremos tocando el margen, sino que la queremos un poco separada. Creo que de
esto ya expliqu un poco en el apartado de los GUI. En resumen, si queremos que la barra este cerca del
borde izquierdo, pero no tocando, basta con ponerle un cierta distancia. Por ejemplo, 50. Ahora en la Y, si le
pusieramos 50 estara cerca de la base, de la parte inferior de la pantalla, y hemos dicho que queremos la
barra arriba. Entonces hacemos lo siguiente: la colocamos en: altura de la pantalla 50. Esto se escribe as:
Y las coordenadas estn listas, ahora vamos con el tamao, esto lo puedes modificar a tu gusto. Yo le he
puesto ancho 200, alto 25. Tal que queda as:
Bien, con esto hemos configurado el tamao y posicin de la imagen, pero no del objeto que la contiene, el
HPbar que tenemos en Hierarchy, el que has arrastrado al script. Para que la imagen se vea en pantalla ese
objeto debe estar colocado en X=0 y Y=0. Si te acuerdas antes te he hecho moverlo, para que no saliera la
textura en pantalla y no moleste. Ahora, con el script, vamos a hacer que mientras juegas, aparezca en esa
posicin, no tienes que moverlo. Para ello, vamos a crear otra lnia con esto:
HPbar.transform.position = Vector3(0,0,1);
Con esto indicamos que la posicion del objeto HPbar es 0,0,1. Por qu ese 1? Muy sencillo, en cuestin de
texturas, si alguna vez tienes que poner una textura encima de otra, dos texturas en la misma posicin pero
una debe estar por encima de otra, como lo indicas? Con la Z. La posicin Z indica que imgenes estn por
delante de otras. Una textura con Z = 2 est en una capa superior a otra con Z = 1.
En este caso le he puesto Z = 1 porque la HPback la estar en la misma posicin que HPbar, pero quiero que
HPbar est por encima. Y ahora estas mismas lnias que acabamos de hacer, las copiamos y cambiamos HPbar
por HPback. As tendremos en la misma posicin las dos barras rojas. Pero cmbiale en el Vector3 en 1 por 0:
Vector3 (0,0,0) que es lo mismo que poner Vector3.zero.
Con SPbar y SPback lo mismo, copia las lnias, solo que debemos desplazarlos horizontalmente, para que estn
un poco ms a la derecha. Si queremos que haya entre las dos barras un espacio de por ejemplo, 50
unidades, la posicin X que debemos poner es: los 50 que le pusimos a la otra barra, + el ancho de la barra +
otros 50 de espacio entre las dos barras. Te hago un apao grfico, para que lo veas:
|
| 50 200 50
|-------HPbarrabarrabarrabarra-------SPbarrabarrabarrabarra
|
As que seran 50 + 200 + 50 = 300;
HPback.transform.position = Vector3.zero;
HPback.guiTexture.pixelInset = Rect (50, Screen.height -50, 200, 25);
HPbar.transform.position = Vector3(0,0,1);
HPbar.guiTexture.pixelInset = Rect (50, Screen.height -50, 200, 25);
SPback.transform.position = Vector3.zero;
SPback.guiTexture.pixelInset = Rect (300, Screen.height -50, 200, 25);
SPbar.transform.position = Vector3(0,0,1);
SPbar.guiTexture.pixelInset = Rect (300, Screen.height -50, 200, 25);
Y una vez situada la barra tendremos que empezar con que las barras muestren la vida y la energa.
Bien primero accedemos al otro script, en el cul estn las variable vida y energa, y pondremos delante de
"var" la palabra "static" de manera que quede as:
Con esto haremos que podamos acceder a la variable desde otros scripts. As que volvemos al script de las
barras, y cambiaremos el ancho de HPbar y SPbar por " 2 * HP.vida".
Ves que para referirme a la variable "vida", que se encuentra en otro script (HP) basta con poner el nombre
del script + punto + nombre variable: HP.vida.
Y lo de multiplicarlo por 2, muy sencillo: vida es una variable que vale 100, mximo 100. Pero en canvio, la
barra de la vida mide 200. Haces una simple regla de tres:
Creo que esto es fcil. Pues ya est, si cambias el 200 de HPbar por 2*HP.vida tendra que funcionar. Lo que
pasa es que tu no notars la diferencia porque como la vida no vara. Vamos a hacer que la vida baje cinco
unidades por segundo, para verlo. En el script HP donde tienes las variables de vida y energa inicia la funcin
Update y en ella escribe:
Aqu no hace falta que escribas delante el nombre del script (HP.vida) porque ya ests en el propio script que
las contiene. Ahora si guardamos y le damos al play deberamos ver como la vida baja, viendo como la barra
va bajando. Pero si te esperas vers que la vida llega a 0, y la barra sigue bajando, y bajando y se sale de la
propia barra, eso es porque no le has puesto lmite, y cuando llega la vida a 0, sigue bajando, a -5, -10, -15...
Bueno eso ya es cosa tuya que vayas jugando con los valores.
Ahora vamos a quitar lo de bajar la vida, qutalo, y vamos a hacer que cuando disparas la energa baje.
Crea un nuevo script llamado disparar. Ms tarde haremos que la nave dispare un proyectil, pero de momento
solo vamos a hacer que la energa baje si pulsas la tecla de disparar.
Iniciamos la funcin Update y dentro creamos una condicion: si pulsas espacio la energa baja:
if (Input.GetKeyDown (KeyCode.space)){
HP.energa -= 5;
}
Guarda y sal. Si lo pruebas debera funcionar, pero otra vez si pulsas demasiado espacio la energa baja ms
de lo que debera tener permitido. Puedes cambiarlo o bien creando en el script HP que si energa <= 0,
energa = 0, as no bajar nunca, o en este condicin, aadir que energa debe ser mayor que 0, pero prefiero
la primera forma.
Dirgete al script HP y pon esto tanto para vida como para energa:
if ( vida <=0){
vida =0;
}
if( vida >= 100){
vida = 100;
}
Haz lo mismo con vida y otra vez cambiando vida por energa. Con esto nos aseguramos que vida y energa
nunca bajen ms de 0 ni superen 100. Ahora si pruebas el juego y disaparas debera funcionar correctamente.
Vamos a hacer ahora que la energa se recupere.
Guarda, prueba el juego y vers que la energa sube, despus de gastarla. Si quieres que suba ms rpida o
ms lenta eso ya es cosa tuya, solo cambia el 3 por otro valor. Ahora vamos a crear un proyectil que salga de
la nave disparado hacia delante. Recuerdo que el proyectil luego tu puedes mejorarlo personalmente o hacer
otro distinto, yo crear uno bsico.
Crea en Project un nuevo prefab, llmalo como quieras, luego crea una esfera. La esfera por s es muy poca
cosa. Casi no se ver y tampoco es muy impresionante. En nuestro caso vamos a mejorarlo simplemente
poniendo una luz. Creamos un point light, que podemos encontrar en GameObject > Create other > point
light. Sitas en hierarchy, la luz creada dentro de la esfera, como un sub objeto.
Ahora asegrate que la luz est en su posicin 0, 0, 0, es decir, en el centro de la esfera. Ahora ya es opcin
tuya hacer que la esfera se vea o no. Puedes hacer que el proyectil se vea como una esfera luminosa o como
un luz sin ms. En mi caso he hecho que la esfera no se vea, pero est ah. Para eso basta con seleccionar la
esfera y en el inspector desactivar la opcin de "Mesh Renderer".
Bien, una ltima cosa, selecciona la esfera y en el inspector activa la condicin de "Is Trigger". Esto es para
que la esfera sea atravesable.
En un principio intent hacer el proyectil sin activar esa opcin y lo que me pas es que al disparar el proyectil,
como este sale desde la nave, colisionaba con ella. Adems ms tarde necesitaremos tener activada la opcin
para detectar la entrada de las rocas, ya lo veremos.
Una vez activada la opcin, mete el conjunto de esfera + luz en el prefab. Ahora vamos a hacer que la nave
dispare. Esto hazlo dentro del mismo script que controla la nave, el que hicimos (en mi caso se llama
"contnave"). Dentro de la funcin Update, y dentro de sta, ponemos como condicin pulsar la tecla de
disparar, yo he elegido espacio. La condicin sera as:
if (Input.GetKeyDown (KeyCode.space)){
if (Input.GetKeyDown (KeyCode.Mouse0){
http://docs.unity3d.com/Documentation/ScriptReference/KeyCode.html
Claramente para esto debes crear, antes de la funcin Update, una variable tipo GameObject, llamada
"bala_prefab":
Adems, queremos que cuando dispares te baje la energa, no? Pues debajo del Instantiate ponemos que la
variable "energa" en el script HP baje:
HP.energia -= 20;
La cantidad es cosa tuya, elije cunto quieres que baje la energa por disparo.
Y arrastras, desde Project, el prefab que hemos creado hasta la variable en el inspector. Quedando todo as:
function Update(){
// Controllador de la nave
if (Input.GetKeyDown (KeyCode.space)){
Instantiate (bala_prefab, transform.position, transform.rotation);
HP.energia -= 20;
}
}
Y listo, con esto disparas, pero... la bala no se mueve, porque no hemos hecho que se mueva. Crea otro
script, llmalo... "mov_bala". En el haremos dos cosas: que la bala se mueva hacia delante, y que si en X
tiempo no choca con nada se destruya. Para ello, iniciamos la funcin Update, y le ponemos el mismo
comando que a la nave:
En X ira la velocidad de la bala hacia delante. Aqu tienes que pensar un poco: no puedes hacer que la bala
vaya ms lenta que la nave, porque entonces disparas y la bala se quedar atrs. No puedes hacer que la bala
vaya a la misma velocidad que la nave, porque entonces la bala no llegar a los objetos que tienes en frente,
sino que se mover con la nave. As que la velocidad tiene que ser mayor.
Aunque tambin podras hacer algo: es posible que a lo largo del juego nos interese variar la velocidad de la
nave, en ese caso tambin debera variar la velocidad de la bala, lgico. Pues para eso podras convertir la
variable velo de la nave en "static var", porque as puedes acceder a ella desde el nuevo script: "mov_bala".
Recuerdo que cuando conviertes una variable a static puedes acceder a ella desde otros script.
Pero ahora surge otro problema, esto no te lo he explicado. Cuando conviertes una variable a static var hay el
problema de que ya no te sale esa variable en el inspector. Anteriormente, para definir la velocidad que
queramos que tuviese la nave te dirigas al inspector, variable velo, y le asignabas un valor, lo escribas. Pues
ahora no es tan fcil, cuando conviertes una variable en static ya no aparece en el inspector, y por tanto ya no
le puedes asignar la velocidad. Como solucionamos esto? De una forma muy sencilla. En el mismo script
donde se encuentra velo, creas otra variable que no sea static, del mismo tipo, que se llame por ejemplo
"local_velo":
Y en la funcin Update indicas que (velo = local_velo). Como local_velo no es static s que aparece en el
inspector, y si le puedes asignar manualmente un valor. Te recuerdo que la funcin Update sucede
continuamente a lo largo de toda la pantalla. Por tanto, velo, que es static, ser todo el rato igual a local_velo.
Si le ponemos 500 a local_velo, velo es tambin 500. De esta forma, le asignamos a una variable static el valor
que queremos desde el inspector. Entonces lo nico que tienes que escribir es:
velo = local_velo;
Y todo listo. Guarda, ejecuta, y al pulsar espacio debera aparecer una bala disparada hacia delante. El script
"mov_bala" resultante sera as:
Este script debes ponrselo al prefab de la bala, del proyectil que hayas hecho. Y en el script de disparar que
es el mismo controlador de la nave, en el inspector, debes arrastrar el prefab del proyectil hasta la variable
bala_prefab.
Bueno que con esto terminamos este apartado. Ya tenemos una nave con vida y energa que se gasta al
disparar, ahora vamos a por los peligros!
8.3 Peligros
A ver, esto es muy sencillo. Tenamos unos cuantos meteoritos en la escena verdad? Pues ahora vamos a
hacer que si chocas con ellos te quitan vida. As de momento el juego consistir en una nave que avanza
automticamente sin cesar y que debe esquivar las rocas para sobrevivir.
Creo que ya tenas unas rocas en la escena. Bien, escoge una y borra todas las dems. Ahora con la roca que
tienes, que llevaba un spherer collider que le pusimos anteriormente. Activa el trigger (seleccionas la roca >
inspector > Sphere Collider > Trigger).
Ahora con esto, la nave atraviesa las rocas, y vamos a hacer que si colisionas con una roca, la vida te baja.
Para esto creamos un script, muy sencillo que diga simplemente esto: si colisionas con una roca te quita vida.
Algo como esto:
function OnTriggerEnter(other:Collider){
if(other.name == "Sphere01"){
HP.vida -= 10;
}
}
En donde pone "Sphere01", t tienes que poner el nombre del meteorito, es decir, el objeto que lleva el
collider. En caso de que tengas el mismo meteorito que yo, el que yo puse en este mismo tutorial, el nombre
ser ese "Sphere01", si tuvieras otro modelo de roca pon el que sea.
Este script debe llevarlo el objeto de la nave que tiene el collider. No podemos poner este cdigo con el
controller, porque el controller est en el objeto que contiene la nave + la cmara, para que cuando se mueve
la nave, la cmara se mueva con ella. Por eso, este script, debe ir solamente a la nave, y ms especficamente
al objeto que tenga el collider. (Por si la nave est formada por varios objetos)
Ahora tambin podramos hacer que, ya que puedes disparar, si disparas a un roca la destruyes. Eso lo
podemos hacer muy fcilmente. Necesitamos que cuando la bala colisione con la roca, esta desaparezca,
puedes ver el mtodo a continuacin, pero me gustara que intentases hacerlo t antes por ti mismo.
En mi caso lo hago as: en el script "mov_bala", el que haca que la bala se moviese (hay una imagen de ese
script ms arriba) debajo de la funcin Update pongo una funcin OnTrigger Enter:
function OnTriggerEnter(other:Collider){
if(other.name == "Sphere01"){
destroy(other.gameObject);
}
}
De esta forma si la bala detecta que ha entrado en un meteorito, lo destruye. Tambin puedes crear un efecto
para cuando se destruyan las rocas. En mi caso he creado un particle system, poca cosa, unas particulas que
salen disparadas cuando le das a un meteorito. Y lo haces aparecer con el comando Instantiate justo debajo
de Destroy. Pero eso ya es cosa tuya.
Bien, a ver! Los meteoritos ya estn puestos, pon este meteorito que acabas de crear, con el collider, y todo
en un prefab. Ahora podras hacer algo muy sencillo y divertido que hice yo. Tienes un meteorito, lo
seleccionas y lo duplicas, luego lo mueves y lo situas a una distancia del otro. Ahora tienes dos, los
seleccionas, duplicas y tienes cuatro. Luego los seleccionas y los vuelves a duplicar, ya tienes 8, luego 16, 32,
64... As los vas repartiendo por la escena.
Te recuerdo que la nave siempre se mueve hacia delante, independientemente de los botones que pulses t. Y
que adems, hicimos que solo se pueda mover verticalmente y horizontalmente una cierta cantidad, por lo que
la nave se movers linealmente a travs de un recorrido, circuito o como quieras llamarlo:
Con esto quiero decir que repartas los meteoritos por dentro de este circuito, no hay necesidad de ponerlos
por fuera, en todo caso como decoracin, pero eso ya es cosa tuya...
Pues con los meteoritos ya he terminado. Pero eso son pocos peligros. Que tal unos drones (androides) que te
ataquen, te disparen. Suena bien. Yo voy a usar este modelo que he encontrado:
http://www.turbosquid.com/3d-models/free-tech-drone/725298
Primero de todo lo situamos en la escena, le aplicamos la textura y pensamos en lo que va a hacer ese drone.
Pues se me ocurre que el drone estar fijo en un sitio, siempre mirndote (a la nave), y te va disparando. Si
una bala te toca te quita vida, y tu puedes naturalmente destruirlos.
Pues empezemos creando un script, yo lo llamo drone. Primero haremos eso de que te mire siempre. Para
esto hay un comando en Unity llamado LookAt:
transform.LookAt (transform)
Donde pone transform va el transform de la nave. Por tanto, necesitamos el transform de la nave en una
variable. Para esto, lo que he hecho yo es ir al script del collider de la nave, el que deca que si chocamos con
una roca nos quitaba vida, ese. Y aqu creo una nueva variable static para poder acceder a ella desde el otro
script:
Y luego en funcin Update, especifico que esa variable tipo transform es el de la nave:
posnave = this.transform;
Aunque no es necesario poner "this.", automticamente el compilador ya sabria que te refieres al transform
de ese objeto si no pones nada:
posnave = transform;
Ahora volviendo al script del drone, lo nico que tenemos que hacer es escribir en Update esta lnia:
transform.LookAt (naColl.posnave);
El script que yo tengo en la nave se llama naColl. Y si quieres probarlo, guarda y dale al Play. El drone debera
estar siempre mirando a la nave.
Siguiente tarea, disparar. Para disparar no hace falta que crees otro proyectil, puedes gastar el mismo que
usabamos para la nave. Solo que, luego haremos que si detecta colisin con el proyectil, te quita vida. Claro,
el problema que podramos tener es que al disparar t con la nave, te hicieras dao con tu propio proyectil.
Pues haremos simplemente que al disparar, el nombre de la bala cambia, ahora vers.
En el mismo script del Drone, justo debajo de LookAt, haremos que el drone dispare. No queremos que
dispare contnuamente, sino una bala cada cierto tiempo, me explico, queremos que dispare ms bien como
una pistola, no como una metralleta, as que haremos que dispare una bala cada segundo.
Para esto, creamos una variable que se llame temp (o como quieras), tipo float, y en Update hacemos que
aumente uno por segundo:
temp += time.DeltaTime;
Para esto claramente tienes que crear la variable "bala_prefab", y "bala" tipo GameObject anteriormente. Y
como hemos dicho antes, para que no se confunda esta bala con la de la nave le cambiamos el nombre. A
continuacin, dentro de la condicin:
bala.name = "Bala_Drone"
Y por ltimo reseteamos el temporizador a 0. Porque si la condicin es que el drone dispare cuando haya
pasado un segundo, al disparar el temporizador vuelve a 0, vuelve a crecer hasta 1, y vuelve a disparar. Para
esto a continuacin de bala.name ponemos lo siguiente:
temp = 0;
Y cerramos condicin. Hecho! Pero aun nos queda un problema. El drone nos dispara en todo momento, es
decir, est bien que si lo tenemos delante nos dispare, pero lo mejor sera que si est muuuy lejos no lo haga.
Para eso deberamos indicarle que si la nave se acerca, empieze a disparar.
Lo que yo he hecho es ponerle al Drone un Sphere Collider (Component > Physics > Sphere Collider), luego
activar el Trigger, y ponerle a la esfera del collider un radio bastante grande, es decir, la esfera, el collider del
drone es mucho ms grande que l. As ahora en el script ponemos que si la nave entra en el collider, empieze
a disparar, y cuando salga del collider, pare de disparar.
Para esto, creamos una variable tipo boolean que se llame disp, y la aadimos a la condicin para disparar,
esa condicin de "if(temp>1)", ahora ponemos "if(temp>1 && disp == true), y luego fuera de la funcin
Update escribimos:
function OnTriggerEnter(other:Collider){
if(other.name == "LOD0"){
disp = true;
}
}
function OnTriggerExit(other:Collider){
if(other.name == "LOD0"){
disp = false;
}
}
Es decir: Si detecta algo entrando, y eso es "LOD0" (la nave), disp se activa, = true, y puede disparar. Si
detecta la nave saliendo, disp = false, y ya no dispara.
Recuerdo que en la condicin (disp == true), no es necesario poner == true, solo con poner if(disp) es
suficiente. En caso de que se quisiera hacer la condicin (disp==false), sera lo mismo que (!disp).
Y ahora solo falta hacer que si la bala toca la nave, nos quite vida. En el script del collider de la nave, en mi
caso se llama naColl.js, tenamos esto:
function OnTriggerEnter(other:Collider){
if(other.name == "Sphere01"){
HP.vida -= 10;
}
}
function OnTriggerEnter(other:Collider){
Y listo! Terminamos as tambin este apartado. Ya tenemos rocas que nos hacen dao y enemigos que nos
disparan, esto empieza a coger forma.